嵌入式学习笔记(6)ARM汇编指令2-常用指令

1.14.1常用ARM指令1:数据处理指令

数据传输指令 mov mvn

算术指令 add sub rsb adc sbc rsc

逻辑指令 and orr eor bic

比较指令 cmp cmn tst teq

乘法指令 mvl mla umull umlal smull smlal

前导零计数 clz

数据传输指令:

mov r1, r0                        @两个寄存器之间数据传递

mov r1, #0xff                     @将立即数赋值给r1

mvn和mov用法是一样的,区别是mvn是按位取反后传递。

逻辑指令:

and:逻辑与

orr:逻辑或

eor:逻辑异或

bic:位清除指令  bic r0, r1, #0x1f @将r1中的数的bit0~bit4清零后赋值给r0

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

(注意:比较指令不用加s后缀就可以影响cpsr中的标志位,之所以这样做的原因是重在过程,而不像mov那种注重结果。例如cmp r0, r1 这句执行之后,下句就可以通过cpsr中的z位为1来知道上句相等。)

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:

1.14.2常用ARM指令2:CPSR访问指令

mrs & msr

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

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

1.14.3常用ARM指令3:跳转(分支)指令

b & bl & bx

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

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

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

1.14.4常用ARM指令4:访存指令

ldr/str & ldm/stm & swp(内存和寄存器互换指令)

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

多字批量访问  ldm/stm  m(multiple 多重的)

swp r1, r2, [r0]  把r0作为地址里边的值读取到r1里边,把r2里边的值写回r0里边。

swp r1, r1, [r0]  把r0作为地址里边的值读取到r1里边,把r1原来的值写回r0里边。

1.14.5常用ARM指令5

swi(software interrupt)

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

1.14.6 ARM汇编中的立即数

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

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

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

非法立即数:0x000001ff

  更多嵌入式学习笔记、实战项目,点击这里即可免费领取

猜你喜欢

转载自blog.csdn.net/m0_70888041/article/details/132595590