http://ift.tt/2FpIH4w
两种不同风格的ARM指令
ARM 官方的ARM汇编指令:指令一般用大写,Windows中IDE开发环境常用,如LDR RO,[R1]
GNU风格的ARM汇编:指令一般用小写字母,linux中常用,如:ldr r0,[r1]
特点1:LDR/STR结构
- ARM 采用RISC(Reduced Instruction Set Computer 中文:精简指令计算机)结构,cpu本身不能直接读取内存,需要先将内存中的内容加载到cpu中的通用寄存器中,而后才能被cpu处理
- ldr(load register)指令将内存内容加载入通用寄存器
- str(store register)指令将寄存器内容存入内存空间中
- ldr/str组合用来实现ARM cpu和内存的数据交互
特点2:8中寻址方式
寻址方式 | 示例 |
---|---|
寄存器寻址 | mov r1,r2 |
立即寻址 | mov r0,#0xff00 |
寄存器移位寻址 | mov r0,r1,lsl#3 |
寄存器间接寻址 | ldr r1,[r2] |
基址变址寻址 | ldr r1,[r2,#4] |
多寄存器寻址 | ldmia r1!,{r2-r7,r12} |
堆栈寻址 | stmfd sp!,{r2-r7,lr} |
相对寻址 | beq sign |
特点3:指令后缀
虽然ARM的汇编指令不是很多,但是通常可以在指令后面跟上后缀,变成不同的指令,常用的指令有:
常用指令后缀 | 解释 |
---|---|
B(byte) | 功能不变,操作长度变为8位 |
H(half word) | 功能不变,长度变为16位 |
S(signed) | 功能不变,操作数变为有符号(如ldrsh,ldrsb) |
S(S标志) | 功能不练,影响CPSR标志位,如(mov 和movs,movs r0,#0) |
特点4:条件执行后缀
条件码 | 助记符 | 助记符全拼 | 说明 | 检测条件 |
---|---|---|---|---|
0000 | EQ | equal | 等于0 | Z=1 |
0001 | NE | not equal | 不等于0 | Z=0 |
0010 | CS/HS | carry / higher or same | 进位/无符号数大于等于 | C=1 |
0011 | CC/LO | /lower(unsigned<) | 为进位/无符号数小于 | C=0 |
0100 | MI | 负数 | N=1 | |
0101 | PL | 正数或零 | N=0 | |
0110 | VS | 溢出 | V=1 | |
0111 | VC | 未溢出 | V=0 | |
1000 | HI | 无符号大于 | C=1&Z=0 | |
1001 | LS | 无符号数小于或等于 | C=0&Z=1 | |
1010 | GE | greater or equal | 有符号数大于或等于 | N=V |
1011 | LT | 有符号数小于 | N!=V | |
1100 | GT | greater than | 有符号数大于 | Z=0&N=V |
1101 | LE | lower or equal | 有符号数小于或等于 | Z=1&N!=V |
1110 | AL | always | 总执行 | 任何状态 |
1111 | NV | 从不(不能使用) | 无 |
特点5:多级指令流水线
为增加处理器指令流的速度,ARM使用多级流水线
注意:当使用多级流水线的时候,PC指向的是正在被取的指令,而非正在执行的指令
也就是说,如果看到PC在0x1008这个地址上,那说明pc正在读0x1008处的指令,在ARM模式下0x1004 (Thumb模式下0x1006)为译码处,而在0x1000(Thumb:0x1004)才是正在执行的代码地址
The post 32位ARM汇编语言(二)ARM 汇编语言特点 appeared first on cole.
http://ift.tt/2DLuJty ArmAsm, ARM, asm, Assembly January 29, 2018 at 08:30PM
评论
发表评论