关键字
.globl
用**.globl**声明一个变量之后,连接器将会引用它。
.word
.word用于申请一个字大小的存储空间。
label
label:instruction @ comment
label 即标号,表示地址位置,有些指令前面可能会有标号,这样就可以通过这个标号得到
指令的地址,标号也可以用来表示数据地址。注意 label 后面的“:”,任何以“:”结尾的标识
符都会被识别为一个标号。
instruction 即指令,也就是汇编指令或伪指令。
**@**符号,表示后面的是注释,就跟 C 语言里面的“/”和“/”一样,其实在 GNU 汇编文
件中我们也可以使用“/”和“/”来注释。
comment 就是注释内容。
MOV
将R1里面的数据赋值到R0中
e.g.
mov R0, R1
mov R0, #0X12
MRS
将特殊寄存器CPSR中的数值复制到R0中
e.g.
MRS R0, CPSR
MSR
MSR 指令用来将普通寄存器的数据传递给特殊寄存器,也是写特殊寄存器
e.g.
MSR CPSR, R0
LDR
LDR 主要用于从存储加载数据到寄存器 Rx 中,LDR 也可以将一个立即数加载到寄存器 Rx中,LDR 加载立即数的时候要使用“=”,而不是“#”。
e.g.
LDR R0**, =0X0209C004 @将寄存器地址 0X0209C004 加载到 R0 中,即 R0=**0X0209C004
LDR R1**, [R0]** @读取地址 0X0209C004 中的数据到 R1 寄存器中
STR
将 Rd 中的数据写入到存储器中的 Rn+offset 位置
e.g.
LDR R0**, =0X0209C004 @将寄存器地址 0X0209C004 加载到 R0 中,即 R0=**0X0209C004
LDR R1**, =0X20000002 @R1 保存要写入到寄存器的值,即 R1=**0X20000002
STR R1**, [R0]** @将 R1 中的值写入到 R0 中所保存的地址中
STR Rd, [Rn, #offset]
将 Rd 中的数据写入到存储器中的 Rn+offset 位置
PUSH
STMFD SP!
将寄存器列表存入栈中。
PUSH {R0~R3, R12} @将 R0~R3 和 R12 压栈
POP
LDMFD SP!
从栈中恢复寄存器列表。
POP {LR} @先恢复 LR
POP {R0~R3,R12} @在恢复 R0~R3,R12
B
跳转到 label,如果跳转范围超过了+/-2KB,可以指定 B.W
BX
间接跳转,跳转到存放于 Rm 中的地址处,并且切换指令集
BL
跳转到标号地址,并将返回地址保存在 LR 中。
BLX
结合 BX 和 BL 的特点,跳转到 Rm 指定的地址,并将返回地址保存在 LR 中,切换指令集。
算数运算
指令 | 翻译 | 含义 |
---|
ADD Rd, Rn, Rm | Rd = Rn + Rm | 加法运算,指令为 ADD | ADD Rd, Rn, #immed | Rd = Rn + #immed | | ADC Rd, Rn, Rm | Rd = Rn + Rm + 进位 | 带进位的加法运算,指令为 ADC | 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 | | | | | | | |
|