第6部分- Linux ARM汇编 指令集概要
ARM指令集可以分为跳转指令、数据处理指令、程序状态寄存器传输指令、Load/Store指令、协处理器指令和异常中断产生指令6类。
ARM指令长为固定的32位。典型的ARM指令编码格式如下:
Opcode:指令操作符编码
Cond是指令执行的条件编码
S是决定指令的操作是否影响CPSR的值
Rd目标寄存器编码
Rn包含第一个操作数的寄存器编码
Shifter_operand:表示第2个操作数。
条件码
条件码cond是4位。
参考:
developer.arm.com/docs/den002…
ARM指令的寻址方式
主要有如下几种:
- 数据处理指令的操作数的寻址方式
- 字及无符号字节的Load/Store指令的寻址方式
- 杂类Load/Store指令的寻址方式
- 批量Load/Store指令的寻址方式
- 协处理器Load/Store指令的寻址方式。
存储访问指令:
LDR
从存储器中加载数据到寄存器。
STR
存储数据到指定的存储单元。
LDM
从指定的存储单元加载多个数据到一个寄存器列表。
STM
将一个寄存器列表的数据的数据存储到指定的存储单元。
PUSH
将寄存器推入满递减堆栈。
POP
从递减堆栈中弹出数据到寄存器。
SWP
用于寄存器和存储器之间的数据交换。
ADD示例
这个在32可以运行,如果是64位前提是bx lr需要替换。
.text.globl main main: add r0,r0, #1 // w0<-w0 + 1 bx lr |
---|
as -g -o add.o add.s
gcc -o add add.o
64位如下:
.arch armv8-a.global _start.text_start:add x0,x0, #1 mov x8, 93 svc 0 |
---|
as -g -o add.o add.s
gcc -o add add.o
跳转指令
ARM中有两种方式可以实现程序的跳转:
- 跳转指令
- 直接向PC寄存器(R15)中写入目标地址值。
直接向PC寄存器中写入目标地址值,可以实现在4GB的地址空间中任意跳转,这种跳转指令又称为长跳转。
还可以从当前指令向前或向后32MB的地址空间跳转。跳转指令有如下4种:
B:跳转指令
BL:待返回的跳转指令
BLX:带返回和状态切换的跳转指令
BX:待状态切换的跳转指令
系统指令
Mnemonic | Instruction |
---|---|
MSR | Move general-purpose register to System Register allows the PE to write an AArch64 System register from a general-purpose register. |
MRS | Move System Register allows the PE to read an AArch64 System register into a general-purpose register. |
SVC | Supervisor Call causes an exception to be taken to EL1. |
NOP | No Operation does nothing, other than advance the value of the program counter by 4. This instruction can be used for instruction alignment purposes. |