一、伪操作
指令 | 描述 | 例子 |
---|
.byte | 定义单字节数据 | .byte 0x12 | .short | 定义双字节数据 | .short 0x1234 | .long | 定义一个 4 字节数据 | .long 0x12345678 | .equ | 赋值语句,格式为:.equ 常量名,不占用内存 | .equ num, 0x12,表示 num=0x12 | .align | 数据字节对齐 | .align 4 表示 4 字节对齐 | .end | 表示源文件结束 | | .global | 定义一个全局符号,可以是函数或者变量 | .global symbol |
二、数据传输指令
指令 | 描述 | 例子 |
---|
mov | 将立即数或者寄存器中的值传输到一个另一个通用寄存器中 | mov r0, r1 | mrs | 将数据从特殊功能寄存器传输到通用寄存器中 | mrs r0, cpsr | msr | 将数据从通用寄存器传输到特殊功能寄存器中 | msr cpsr, r0 |
三、存储器访问指令
指令 | 描述 | 例子 |
---|
ldr | 将4字节数据从内存读取到寄存器中 | LDR Rd, [Rn , #offset] | str | 将4字节数据从寄存器写到内存中 | STR Rd, [Rn, #offset] |
ldr和str后面可以加上b或者h,例如ldrh是加载半字数据到寄存器中,寄存器的高16位会被清零,ldrb是加载字节数据到寄存器中,寄存器的高24位会被清零。 arm汇编中的ldr和mov有一些像,但是mov只能加载一个立即数,ldr可以将一个地址加载到通用寄存器,换句话说,ldr和mov都可以将一个值加载到通用寄存器中。
四、入栈和出栈
指令 | 描述 | 例子 |
---|
push {reg list} | 将寄存器入栈 | push {r0~r2, r3} | pop {reg list} | 将寄存器出栈 | pop {r0~r2, r3} | stmfd sp!, {reg list} | 将寄存器入栈 | stmfd sp!, {r0~r2, r3} | ldmfd sp!, {reg list} | 将寄存器出栈 | ldmfd sp!, {r0~r2, r3} |
五、跳转指令
指令 | 描述 | 例子 |
---|
b label | 跳转到label(+/-2KB) | b start | bl label | 带返回地址的的跳转 | bl start | bx reg | 间接跳转,将跳转到寄存器所在地址 | bx r0 | blx reg | 带返回地址的间接跳转,将跳转到寄存器所在地址 | blx r0 |
七、算数运算
指令 | 例子 | 描述 |
---|
ADD Rd, Rn, Rm | Rd = Rn + Rm | 加法运算,指令为 ADD | ADD Rd, Rn, #immed | Rd = Rn + #immed | | ADC Rd, Rn, Rm | Rd = Rn + Rm + 进位 | 带进位的加法 | ADC Rd, Rn, #immed | Rd = Rn + #immed +进位 | | SUB Rd, Rn, Rm | Rd = Rn – Rm | 减法 | SUB Rd, #immed | Rd = Rd - #immed | | SUB Rd, Rn, #immed | Rd = Rn - #immed | | SBC Rd, Rn, #immed | Rd = Rn - #immed – 借位 | 带借位的减法 | SBC Rd, Rn ,Rm | Rd = Rn – Rm – 借位 | | MUL Rd, Rn, Rm | Rd = Rn * Rm | 乘法(32 位) | UDIV Rd, Rn, Rm | Rd = Rn / Rm | 无符号除法 | SDIV Rd, Rn, Rm | Rd = Rn / Rm | 有符号除法 |
六、位运算
指令 | 例子 | 描述 |
---|
AND Rd, Rn | Rd = Rd &Rn | 按位与 | AND Rd, Rn, #immed | Rd = Rn &#immed | | AND Rd, Rn, Rm | Rd = Rn & Rm | | ORR Rd, Rn | Rd = Rd | Rn | 按位或 | ORR Rd, Rn, #immed | Rd = Rn | #immed | | ORR Rd, Rn, Rm | Rd = Rn | Rm | | BIC Rd, Rn | Rd = Rd & (~Rn) | 位清除 | BIC Rd, Rn, #immed | Rd = Rn & (~#immed) | | BIC Rd, Rn , Rm | Rd = Rn & (~Rm) | | ORN Rd, Rn, #immed | Rd = Rn | (#immed) | 按位或非 | ORN Rd, Rn, Rm | Rd = Rn | (Rm) | | EOR Rd, Rn | Rd = Rd ^ Rn | 按位异或 | EOR Rd, Rn, #immed | Rd = Rn ^ #immed | | EOR Rd, Rn, Rm | Rd = Rn ^ Rm | |
|