ARM汇编语言

汇编语言结构

条件码(31-28)

指令码(27-20)

目的寄存器(19-16)

操作数1寄存器(15-12)

操作数2(11-0)

  1. 操作码(Opcode):指示要执行的具体操作。不同的操作码代表不同的指令功能,例如数据传输、算术运算、逻辑运算等。

  2. 目标寄存器(Destination Register):指定指令执行的结果将存储在哪个寄存器中。

  3. 源操作数(Source Operand):指定参与指令操作的源数据,可以是立即数、寄存器或者内存地址。

  4. 第二个操作数(Second Operand):对于一些指令来说,可能会有第二个操作数,例如在进行算术运算时可能会有两个操作数。

  5. 条件码(Condition Code):可选项,用于指定在何种条件下执行该指令。不同的条件码代表不同的条件,例如等于、不等于、大于等等。

  6. 移位操作数(Shift Operand):可选项,用于指定对源操作数进行移位操作。

ARM的数据类型

  1. 整数数据类型:包括有符号整数(如int、short、long等)和无符号整数(如unsigned int、unsigned short、unsigned long等),可以是8位、16位、32位或64位。

  2. 浮点数数据类型:包括单精度浮点数(float)和双精度浮点数(double)。

  3. 字符数据类型:包括char类型,通常是8位的。

  4. 布尔数据类型:包括bool类型,通常是一个字节大小。

  5. 向量数据类型:通过NEON技术支持的向量数据类型,包括8位、16位、32位和64位的整数型向量,以及32位和64位的浮点型向量。

加载和存储的数据类型可以是无符号(有符号)的字(word)、半字(halfword)、字节(bytes),arm汇编中扩展后缀-sh和-h对应半字、-sb和-b对应字节,相关汇编指令:

ldr     @加载字 //加载8位字节
ldrh    @加载无符号半字 //加载一个半字32位
ldrsh   @加载半字//加载一个半字32位,会将符号扩展到64位
ldrb    @加载无符号字节 //加载一个字节
ldrsb   @加载字节 //将一个字节并进行符号扩展到64位
str     @存储字 //存储8个字节
strh    @存储无符号半字 //加载4字节到目标寄存器
strsh   @存储半字 //将4字节有符号数加载到内存进行扩展
strb    @存储无符号字节 //加载8位字节到内存,不会进行符号扩展
strsb   @存储字节 //加载8位有符号数到内存并会进行符号扩展

ARM寄存器

ARM处理器共有37个寄存器。这些寄存器包括:

31个通用寄存器,包括未分组寄存器R0-R7、分组寄存器R8-R14和程序计数器( PC 指针),均为32位的寄存器。
6个状态寄存器,包括程序状态寄存器 CPSR 和5个物理状态寄存器 SPSR (用以异常发生时保存 CPSR 的值,异常退出时恢复 CPSR )。 这些状态寄存器用以标识 CPU 的工作状态及程序的运行状态,均为64位。

其中如下:

未分组的寄存器R0-R7

在所有运行模式(处理器模式)下,未分组寄存器都指向同一个物理寄存器,它们未被系统用作特殊的用途。因此在中断或异常处理进行运行模式转换时,由于不同的处理器运行模式均使用相同的物理寄存器,所以可能造成寄存器中数据的破坏。

R0-R3 用于传参数,更多的参数须通过栈来传递,调用函数的时候,参数先从R0依次传递;R0-R1 也作为结果寄存器,保存函数返回结果,被调用的子程序在返回前无须恢复这些寄存器的内容。

R4-R6 没有特殊规定,就是普通的通用寄存器,作为被调保存(callee-save)寄存器,一般保存函数的局部变量(local variables)。被调保存寄存器(callee-save register)是指,如果这个寄存器被调用/使用之前,需要被保存

分组寄存器 R8-R14

在 ARM 架构中,R8 到 R14 是通用寄存器,也被称为分组寄存器。这些寄存器在 ARM 汇编语言中经常用于存储临时数据、传递参数、存储局部变量以及存储函数调用的返回地址等。具体来说,它们的作用如下:

R8 - 用于存储函数的第一个参数
R9 - 用于存储函数的第二个参数
R10 - R12 - 用于存储临时数据和局部变量
R13 - 堆栈指针(SP),用于指向当前堆栈的顶部 
R14 - 链接寄存器(LR),用于存储函数调用的返回地

R9 是操作系统保留。

R11 又称作帧指针(FP),通常Arm模式下R11作为帧指针,Thumb模式下R7则作为帧指针。

R13 栈指针寄存器(SP),用于存放栈顶指针,该栈是一块用来存储本地函数的内存区域。当函数被返回时, 存储空间会被回收。 在堆栈上分配空间,需要从栈寄存器(the stack register)减去。分配一个32位的值, 需要从堆栈指针(the stack pointer)减去4。Arm堆栈结构是从高向低压栈的,因为处理器是32位的Arm,所以每压一次栈,SP就会移动4个字节(32位),也就是SP = SP - 4。由于处理器的每种运行模式均有属于自己的物理寄存器R13,使其指向该运行模式下的栈空间,这样,当程序的运行进入异常模式时,可以将需要保护的寄存器放入R13所指向的堆栈,而当程序从异常模式返回时,则从对应的堆栈恢复,采用这种方式可以保证异常发生后程序的正常执行。

R14 链接寄存器(LR),当一个子程序被调用时,LR 会被填入程序计数器(PC);当一个子程序执行完毕后,PC从 LR 的值恢复,从而返回(到主函数中)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值