嵌入式开发笔记(六) ARM汇编指令集基础2 原

ARM 427浏览

ARM汇编指令集基础2

基本内容回顾:

1. ldr,

  str,

2. mov r0,r1

   mov r0, #0XFF00

   mov r0 ,r1,lsl#3

   ld r0, [r1]

   ld r0,[r1,#4]

   ldmia r0!,{r1-r7,r12}

   stmfd  sp!,{r2-r7,r12}

   beq flag

      flag

3.ldr,ldrb,ldrh,ldrsb,ldrsh,movs

4.moveq,movgt,movlt,

5.流水线

 

常用ARM指令

1:数据处理指令

(1)数据传输指令 mov mvn

(2)算术指令 add sub rsb adc sbc rsc

(3)逻辑指令 and orr eor bic

(4)比较指令 cmp cmn tst teq

(5)乘法指令 mvl mla umull umlal smull smlal

(6)前导零计数 clz

    1.2讲解:

       1.mov(move) mov r1, r0 两个寄存器之间数据传递

        mov r1, #0xff     将立即数赋值给寄存器

       2.mvn和mov用法一样,区别是mov是原封不动的传递,而mvn是按位取反后传递

       按位取反的含义:

   列:r1 = 0x000000ff,然后mov r0, r1 后,r0 = 0xff

                                       mvn r0, r1后,r0=0xffffff00

        3.

        and 逻辑与

        orr 逻辑或

        eor 裸机异或

          4.

        bic 位清除指令

 

bic r0,r1,#0x1f @ 将r1中的数的bit0到bit4清零后赋值给r0 0x1f = 0x0000001f=0x0000```11111

        5.比较指令:

            cmp cmp r0, r1  等价于 sub r2, r0, r1 (r2 = r0 - r1)

            cmn cmn r0, r1  等价于 add r0, r1

            tst tst r0, #0xf 测试r0的bit0~bit3是否全为0

            teq

            比较指令用来比较2个寄存器中的数

            列:tst  r0, #0xf 测试bit0-bit3是否全为0;

 

引用:http://luleimi.blog.163.com/blog/static/17521964520133181756210/

 

注意:比较指令不用后加s后缀就可以影响cpsr中的标志位。

2.cpsr访问指令

mrs & msr

 

mrs用来读cpsr,spsr,msr用来写cpsr,spsr

CPSR寄存器比较特殊,需要专门的指令访问,这就是mrs和msr。

知识点回顾:

cpsr和spsr的区别和联系:

cpsr是程序状态寄存器,

整个SoC中只有1个;而spsr有5个,分别在5种异常模式下,

作用是当从普通模式进入异常模式时,

用来保存之前普通模式下的cpsr的,以在返回普通模式时恢复原来的cpsr。

  列:mrs r0 ,cpsr

        bic r0,r0,#0x1f

        orr r0,r0,#0xd3

        msr cpsr ,r0

msr cpsr_c ,#0xd3  cpsr_c,8个控制位

msr cpsr_cxsf,r1        ;

这里的cxsf表示从低到高分别占用的4个8bit的数据域

指令中有时还有出现cpsr_cf, cpsr_all, cpsr_c等,这里:

        c 指 CPSR中的control field ( PSR[7:0])
        f 指 flag field (PSR[31:24])
        x 指 extend field (PSR[15:8])
        s 指 status field ( PSR[23:16])

其中cpsr的位表示为:
31 30 29 28 ---   7   6   -   4    3   2   1   0
N   Z   C   V         I   F       M4 M3 M2 M1 M0

                                       0     0   0    0   0     User26 模式
                                       0    0   0    0   1     FIQ26 模式
                                       0    0   0    1   0     IRQ26 模式
                                       0    0   0    1   1     SVC26 模式
                                       1    0   0   0   0     User 模式
                                       1    0   0    0   1     FIQ 模式
                                       1    0   0    1   0     IRQ 模式
                                       1    0   0    1   1     SVC 模式
                                       1    0   1    1  1     ABT 模式
                                       1    1  0     1   1     UND 模式

3.跳转(分支)指令

b & bl & bx

(1)b 直接跳转(就没打算返回)

(2)bl   branch and link,跳转前把返回地址放入lr中,以便返回,以便用于函数调用

(3)bx跳转同时切换到ARM模式,一般用于异常处理的跳转。

4.访存指令

ldr/str & ldm/stm & swp

    单个字/半字/字节访问 ldr/str

    多字批量访问  ldm/stm

swp r1, r2, [r0]

swp r1, r1, [r0]

    4.1ARM汇编中的立即数

        (1)合法立即数与非法立即数

     (2)ARM指令都是32位,除了指令标记和操作标记外,本身只能附带很少位数的立即数。因此立   即 数 有合法和非法之分。

      (3)合法立即数:经过任意位数的移位后非零部分可以用8位表示的即为合法立即数

合法立即数: 0x000000ff 0x00ff0000 0xf000000f

非法立即数: 0x000001ff

5:软中断指令

swi(software interrupt)

 

软中断指令用来实现操作系统中系统调用