汇编指令是CPU指令的助记符,经过编译后会生成一串10组成的机器码,可以由CPU读取执行。
汇编伪指令本质上不是伪指令(只是和指令一起写在代码中),它是编译器环境提供的,目的是用来知道编译过程,经过编译后伪指令最终不会生成机器码。
ARM汇编特点1:
ARM采用RISC架构,CPU本身不能直接读取内存,而需要先将内存中的内容加载入CPU中的通用寄存器中才能被CPU处理。
ldr(load register)指令将内存内容加载到通用寄存器中。
str(storeregister)指令将通用寄存器内容加载到内存中。
ldr/str组合用来实现ARM CPU和内存数据交换
ARM汇编特点2:ARM支持8中寻址方式
寄存器寻址 mov r1,r2
立即寻址mov r0, #0xff0
寄存器移位寻址 mov r0, r1, lsl #3
寄存器间接寻址 ldr r1, [r2]
基址变址寻址 ldr r1,[r2,#4]
多寄存器寻址ldmiar1!,{r2-r7,r12}
堆栈寻址stmfdsp!,{r2-r7,lr}
相对寻址 beq flag
flag:
ARM汇编特点3:指令后缀
同一指令经常附带不同后缀,编程不同的指令。经常使用的后缀有
B(byte)功能不变,操作长度变为8位
H(half word)功能不变,长度变为16位
S(signed)功能不变,操作数变为有符号
如 ldr ldrb ldrh ldrsb ldrsh
S(S标志)功能不变,影响SPSR标志位
如mov和movs movs r0,#0
ARM汇编特点4:条件执行后缀
比如
mov r0, r1 @相当于C语言中的r0 = r1;
moveqr0,r1@如果eq后缀成立,则直接执行movr0r1;如果eq不成立,则本句代码直接作废,相当于没有,类似C语言if(eq){movr0,r1}。
1、条件后缀是否成立,不是取决去本句代码,而是取决于这句代码之前的代码运行的后果。
2、条件后缀决定了本句代码是否被执行,而不会影响上一句和下一句代码是否被执行。
后缀如下:
ARM汇编特点5:多级指令流水线
为增加处理器指令流的速度,ARM使用多级流水线。
取址----解码----执行,这只是简单的三级流水线,像S5PV210是用13级流水线,ARM11为8级。
数据处理指令
数据传输指令:movmvn
mov r0,r1
mov r0,#0xff
mov和mvn用法一样,区别是mov是原封不动地传递,而mvn是按位取反后传递。
算数指令add sub rsb adc sbc rsc
逻辑指令and orr eor bic
比较指令cmpcmntstteq,注意比较指令不用加S(见ARM汇编特点3)就可以影响cpsr中的标志位。
乘法指令mvl mla umull nmlal smull smlal
前导零计数clz
这些指令详解,直接百度搜就能知道。
cpsr访问指令
mrs和msr
mrs用来读psr,msr用来写psr
cpsr和spsr的区别和联系:cpsr是程序状态寄存器,整个SoC中只有一个;而spsr有五个,分别在5中异常模式下,作用是当从普通模式进入异常模式时,用来保存普通模式下的cpsr的,以再返回普通模式时恢复cpsr。
跳转指令b bl bx
b直接跳转(就没打算返回)。
blbranchandlink,跳转前把返回地址放入lr中,以便返回,以便于函数调用。
bx跳转同时切换到ARM模式,一般用于异常处理的跳转。
访存指令:
ldr str ldm stm swp
单个字/半字/字节访问 ldr/str
多字批量访问ldm/stm
swpr1,r2,[r0]@把内存中r0存入r1,再把r2存入r0
ARM汇编中的立即数:
合法立即数与非法立即数
ARM指令都是32位,除了指令标记和操作标记外,本身只能附带很少尾数的立即数。因此立即数有合法与非法之分
合法立即数:经过任意位数的移位后非零部分可以用8位表示的即为合法立即数
软终端指令:swi
软中断用来实现操作系统中系统调用
如果觉得《Arm汇编指令集1》对你有帮助,请点赞、收藏,并留下你的观点哦!