ARM汇编语言中的助记符(Mnemonic)是什么?
/>
在ARM汇编语言中,助记符(Mnemonic)是代表特定CPU指令的简短英文单词或缩写。
它的主要作用是为了方便人类记忆和编程,因为直接使用二进制机器码(如0xE3A01001)来编写程序是非常困难且容易出错的。
助记符直接对应了CPU可以执行的特定操作。
可以这样理解:
- 助记符:写给程序员看的英文单词(例如
MOV,ADD)。 - 机器码:写给CPU看的二进制数字(例如
0xE3A01001)。 - 汇编器:把助记符翻译成机器码的工具。
/>
ARM汇编中常见的助记符分类及示例
ARM指令集非常丰富,助记符通常可以分为以下几大类:
1.
数据传送指令
用于在寄存器之间或者寄存器和立即数之间传送数据。
MOV(Move):R0,
将R2的值复制到R1。
MVN(Moveand
将0取反(即全部bit变为1,也就是-1)存入R0。
2.
算术运算指令
ADD:R0,
R2
SUB(Subtract):R0,
5
RSB(ReverseR0,
(注意顺序与SUB相反)
MUL(Multiply):R0,
R2
UDIV/SDIV:除法(无符号/有符号)。
3.
逻辑运算指令
AND:R0,
取R1的低8位存入R0。
ORR(Or):按位或。
EOR(ExclusiveOr):
按位异或。
BIC(BitR0,
3),结果存入R0。
4.
比较指令
这类指令通常不会保存计算结果,而是根据结果更新CPSR(当前程序状态寄存器)中的条件标志位(如Z,
N,
V),供后续条件执行使用。
CMP(Compare):R0,
10,影响标志位。
CMN(Compare+
Op2)。
TST(Test):&
测试R0的最低位是否为1(Z=1表示结果为0,即最低位为0)。
TEQ(Test跳转指令
用于改变程序的执行流(如循环、if-else、函数调用)。
B(Branch):loop:
跳转到标签
loop处执行。
BL(Branchwith
带链接的跳转,用于函数调用。
它会在跳转前将下一条指令的地址(返回地址)保存到LR(链接寄存器,R14)中。
BL调用printf函数。
BX(Branchand
Thumb)。
BLX:结合了BL和BX的功能。
6.
内存访问指令
ARM架构采用加载/存储(Load/Store)模型:必须先将内存中的数据加载到寄存器,处理完后再存回内存。
LDR(LoadR0,
读取R1寄存器中保存的地址所指向的内存数据,存入R0。
LDRR0,
(伪指令)将地址值加载到R0。
STR(Store将寄存器中的数据存储到内存。
STRR0,
将R0的值写入到R1指向的内存地址。
LDM/STM(Load/Store批量加载/存储,用于同时操作多个寄存器(常用于堆栈操作和现场保护)。
PUSH/POP:堆栈操作(实际上是STMDB和LDMIA的别名,更易记)。
PUSH{R0-R3,
将R0-R3和返回地址压入堆栈。
POP{R0-R3,
弹出数据,并恢复程序计数器,实现函数返回。
7.
其他特殊指令
SWI/SVC(SoftwareInterrupt
软件中断,用于触发系统调用(如Linux的
syscall),切换到内核态。NOP(No空操作,常用于短时间延时或指令对齐。
/>
总结
在ARM汇编中,助记符就是指令的名字。
它告诉汇编器“我们想要CPU做什么”。
例如:
- 看到
MOV,就知道是赋值。 - 看到
ADD,就知道是加法。 - 看到
LDR,就知道是从内存读取。 - 看到
B,就知道是跳转。
结合操作数(寄存器、立即数、内存地址),就构成了完整的汇编指令,例如MOV
R0,
#42。


