汇编指令是CPU指令的助记符,经过编译后会生成一串10组成的机器码,可以由CPU读取执行。
汇编伪指令本质上不是伪指令(只是和指令一起写在代码中),它是编译器环境提供的,目的是用来知道编译过程,经过编译后伪指令最终不会生成机器码。
ARM汇编特点1:
ARM采用RISC架构,CPU本身不能直接读取内存,而需要先将内存中的内容加载入CPU中的通用寄存器中才能被CPU处理。
ldr(load register)指令将内存内容加载到通用寄存器中。
str(store register)指令将通用寄存器内容加载到内存中。
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]
多寄存器寻址 ldmia r1!,{r2-r7,r12}
堆栈寻址 stmfd sp!,{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;
moveq r0, r1 @如果eq后缀成立,则直接执行mov r0 r1; 如果eq不成立,则本句代码直接作废,相当于没有,类似C语言 if(eq) {mov r0, r1}。
1、条件后缀是否成立,不是取决去本句代码,而是取决于这句代码之前的代码运行的后果。
2、条件后缀决定了本句代码是否被执行,而不会影响上一句和下一句代码是否被执行。
后缀如下:
ARM汇编特点5:多级指令流水线
为增加处理器指令流的速度,ARM使用多级流水线。
取址----解码----执行,这只是简单的三级流水线,像S5PV210是用13级流水线,ARM11为8级。
数据处理指令
数据传输指令 :mov mvn
mov r0,r1
mov r0,#0xff
mov和mvn用法一样,区别是mov是原封不动地传递,而mvn是按位取反后传递。
算数指令 add sub rsb adc sbc rsc
逻辑指令 and orr eor bic
比较指令 cmp cmn tst teq,注意比较指令不用加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 直接跳转(就没打算返回)。
bl branch and link,跳转前把返回地址放入lr中,以便返回,以便于函数调用。
bx 跳转同时切换到ARM模式,一般用于异常处理的跳转。
访存指令:
ldr str ldm stm swp
单个字/半字/字节访问 ldr/str
多字批量访问 ldm/stm
swp r1,r2,[r0] @把内存中r0存入r1,再把r2存入r0
ARM汇编中的立即数:
合法立即数与非法立即数
ARM指令都是32位,除了指令标记和操作标记外,本身只能附带很少尾数的立即数。因此立即数有合法与非法之分
合法立即数:经过任意位数的移位后非零部分可以用8位表示的即为合法立即数
软终端指令:swi
软中断用来实现操作系统中系统调用