第6部分- Linux ARM汇编 指令集概要

ARM指令集可以分为跳转指令、数据处理指令、程序状态寄存器传输指令、Load/Store指令、协处理器指令和异常中断产生指令6类。

            ARM指令长为固定的32位。典型的ARM指令编码格式如下:

第6部分- Linux ARM汇编 指令集概要_寻址方式

Opcode:指令操作符编码

Cond是指令执行的条件编码

S是决定指令的操作是否影响CPSR的值

Rd目标寄存器编码

Rn包含第一个操作数的寄存器编码

Shifter_operand:表示第2个操作数。

 

条件码

条件码cond是4位。

第6部分- Linux ARM汇编 指令集概要_寻址方式_02

参考:

https://developer.arm.com/docs/den0024/a/the-a64-instruction-set/data-processing-instructions/conditional-instructions

 

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.