基础知识
指令与伪指令
汇编指令:CPU机器指令的助记符,编译后得到1和0组成的机器码,由CPU读取执行
伪指令:本质上不是指令,由编译环境提供,谜底在于知道编译过程,最终不会生成机器码
不同的ARM风格
ARM官方汇编风格:指令一般大写,windows IDE开发环境常用。(譬如:LDR、STR)
GNU风格的ARM汇编:指令一般小写,linux中常用。(譬如:ldr、str)
ARM汇编的特点
ARM汇编特点1:LDR和STR架构
ARM采用RISC架构,CPU不能直接读取内存,需要将内存内容加载到CPU通用寄存器才能被CPU处理。
ldr(load register):将内存内容加载到通用寄存器
str(store register):将指令存取通用寄存器
用ldr和str组合就能很好实现数据交换
ARM汇编特点2:八种寻址方式
寄存器寻址 mov r1, r2 //把r2存入r1 立即寻址 mov r0, #0xFF00 //把后面的数字存入r0 寄存器移位寻址 mov r0, r1, lsl #3 //把r1左移3位后存入r1 寄存器间接寻址 ldr r1, [r2] //把r2这个内存地址所对应的值赋值给r1 基址变址寻址 ldr r1, [r2, #4] //把r2+4后的内存地址多对应的值存入r1 多寄存器寻址 ldmia r1!, {r2-r7, r12} //把r1到r7以及r12依次存在r1,r2,r3,r4,r5,r6,r7,r8 堆栈寻址 stmfd sp!, {r2-r7, lr} //把堆栈SP中的内容依次存在r2,r3,r4,r5,r6,r7,lr中 相对寻址 beq flag //跳转到标号flag flag:
ARM汇编特点3:指令后缀
同一指令经常附带不同后缀,变成不同的指令。
经常使用的后缀有:
B(byte)功能不变,操作长度变为8位
H(half word)功能不变,长度变为16位 //由于我们在32位系统中,依次操作32位的效率是最高的,所以一般用ldr
S(signed)功能不变,操作数变为有符号 如 ldr ldrb ldrh ldrsb ldrsh
S(S标志)功能不变,影响CPSR标志位 如 mov和movs movs r0, #0
ARM汇编特点4:条件执行后缀
无后缀:mov r0, r1
有后缀:moveq r0, r1 //如果eq后缀成立则执行mov r0, r1,如果不成立则本句代码作废
注意:(1)条件执行后缀是否成立,不是取决于本句代码,而是取决于之前代码执行的结果
(2)条件后缀决定了本句代码是否执行,而不会影响上一句和下一句代码是否被执行
常用的一般就是EQ(equal)、NE(not equal)、GT(great than)、LT(less than)
ARM汇编特点5:多级指令流水线
为了让CPU处理起来更加的具有效率,CPU往往是一边执行指令的同时就在提前读取下面的指令了,对于三级流水线,以ARM为例子,在32位系统中,一条指令刚好4个字节。
举例分析:假设有三条指令地址为:0xd002_0040、0xd002_0044、0xd002_0048
当前已经执行到0xd002_0040,为了保证运行流畅高效,实际上CPU指令指针PC已经指向0xd002_0048了,开始做准备工作了。所以对应的,他们的地址分别为:PC-8和PC。