ARM32常见指令


### 📌 1. 保存和设置堆栈框架


`.text:00002E88                 PUSH            {R11,LR}`

**PUSH {R11,LR}**:将R11(帧指针)和LR(链接寄存器)推入堆栈,以保存当前的帧指针和返回地址。

`.text:00002E8C                 MOV             R11, SP`

**MOV R11, SP**:将堆栈指针的当前值保存到帧指针R11中。

`.text:00002E90                 SUB             SP, SP, #0x20`

**SUB SP, SP, #0x20**:为本地变量在堆栈上分配32字节的空间。

### 📌 2. 加载字符串地址和处理字符


`.text:00002E94                 LDR             R0, =0xFFFFDEDF`

**LDR R0, =0xFFFFDEDF**:将立即数0xFFFFDEDF加载到R0寄存器中。


`.text:00002E98                 ADD             R0, PC, R0 ; "Alice"`

**ADD R0, PC, R0**:将R0中的值与PC(程序计数器)的值相加,得到字符串"Alice"的地址。

`.text:00002E9C                 LDRB            R1, [R0] ; "Alice"`

**LDRB R1, [R0]**:从R0寄存器指向的内存地址加载一个字节到R1寄存器中。

`.text:00002EA0                 STRB            R1, [R11,#-6]`

**STRB R1, [R11,#-6]**:将R1中的字节存储到R11指向的地址减去6的内存位置中。

### 📌 重复字符处理


类似的指令继续加载和存储字符串 "Alice" 的每个字符到不同的内存位置。

### 📌 3. 加载立即数和浮点操作

`.text:00002ECC                 MOVW            R0, #0x1E`

**MOVW R0, #0x1E**:将立即数0x1E加载到R0寄存器中。

`.text:00002ED0                 STR             R0, [R11,#var_C]`

**STR R0, [R11,#var_C]**:将R0中的值存储到R11指向的地址减去某个偏移量的内存位置中。

`.text:00002ED4                 VLDR            S0, =65.5`

**VLDR S0, =65.5**:将浮点常数65.5加载到S0寄存器中。

`.text:00002ED8                 VSTR            S0, [SP,#0x20+var_10]`

**VSTR S0, [SP,#0x20+var_10]**:将S0寄存器中的浮点数存储到堆栈上的某个偏移位置。

### 📌 4. 转换和调用函数

`.text:00002EE4                 VLDR            S0, [SP,#0x20+var_10]`

**VLDR S0, [SP,#0x20+var_10]**:从堆栈加载浮点数到S0寄存器中。

`.text:00002EE8                 VCVT.F64.F32    D16, S0`

**VCVT.F64.F32 D16, S0**:将单精度浮点数S0转换为双精度浮点数并存储到D16寄存器中。

`.text:00002EF4                 VSTR            D16, [SP,#0x20+var_20]`

**VSTR D16, [SP,#0x20+var_20]**:将D16寄存器中的双精度浮点数存储到堆栈上的某个偏移位置。

`.text:00002EF8                 BL              printf`

**BL printf**:调用`printf`函数。

### 数据处理指令

1. **MOV(Move)**
    
    - **功能**: 将一个值传送到寄存器中。
    - **示例**:
        `MOV R0, #1  ; 将立即数1加载到R0寄存器`
        
2. **ADD(Add)**
    
    - **功能**: 执行加法运算。
    - **示例**:
        `ADD R0, R1, R2  ; 将R1和R2的值相加,并将结果存储到R0中`
        
3. **SUB(Subtract)**
    
    - **功能**: 执行减法运算。
    - **示例**:
        `SUB R0, R1, #10  ; 将R1减去10,并将结果存储到R0中`
        
4. **MUL(Multiply)**
    
    - **功能**: 执行乘法运算。
    - **示例**:
        `MUL R0, R1, R2  ; 将R1和R2的值相乘,并将结果存储到R0中`
        
5. **AND(Logical AND)**
    
    - **功能**: 执行按位与运算。
    - **示例**:
        `AND R0, R1, R2  ; 对R1和R2的值执行按位与运算,并将结果存储到R0中`
        
6. **ORR(Logical OR)**
    
    - **功能**: 执行按位或运算。
    - **示例**:
        `ORR R0, R1, R2  ; 对R1和R2的值执行按位或运算,并将结果存储到R0中`
        
7. **EOR(Exclusive OR)**
    
    - **功能**: 执行按位异或运算。
    - **示例**:
        `EOR R0, R1, R2  ; 对R1和R2的值执行按位异或运算,并将结果存储到R0中`
        
8. **CMP(Compare)**
    
    - **功能**: 比较两个值,并设置条件标志。
    - **示例**:
        `CMP R0, #10  ; 比较R0和10`
        

### 内存访问指令

1. **LDR(Load Register)**
    
    - **功能**: 从内存加载一个字到寄存器。
    - **示例**:
        `LDR R0, [R1]  ; 从R1指向的内存地址加载一个字到R0中`
        
2. **STR(Store Register)**
    
    - **功能**: 将一个字从寄存器存储到内存。
    - **示例**:
        `STR R0, [R1]  ; 将R0中的值存储到R1指向的内存地址`
        
3. **LDRB(Load Register Byte)**
    
    - **功能**: 从内存加载一个字节到寄存器。
    - **示例**:
        `LDRB R0, [R1]  ; 从R1指向的内存地址加载一个字节到R0中`
        
4. **STRB(Store Register Byte)**
    
    - **功能**: 将一个字节从寄存器存储到内存。
    - **示例**:
        `STRB R0, [R1]  ; 将R0中的一个字节存储到R1指向的内存地址`
        

### 分支和控制流指令

1. **B(Branch)**
    
    - **功能**: 无条件跳转到一个地址。
    - **示例**:
        `B label  ; 跳转到标签label处`
        
2. **BL(Branch with Link)**
    
    - **功能**: 跳转到一个地址,并保存返回地址到LR寄存器。
    - **示例**:
        `BL function  ; 跳转到函数function,并保存返回地址`
        
3. **BX(Branch and Exchange)**
    
    - **功能**: 跳转到寄存器中存储的地址,并切换处理器状态(如从ARM状态到Thumb状态)。
    - **示例**:
        `BX LR  ; 跳转到LR寄存器中存储的地址`
        
4. **BEQ(Branch if Equal)**
    
    - **功能**: 如果上一次比较的结果为相等,跳转到一个地址。
    - **示例**:
        `BEQ label  ; 如果相等,跳转到标签label处`
        
5. **BNE(Branch if Not Equal)**
    
    - **功能**: 如果上一次比较的结果为不相等,跳转到一个地址。
    - **示例**:
        `BNE label  ; 如果不相等,跳转到标签label处`
        

### 浮点和SIMD指令

1. **VADD(Vector Add)**
    
    - **功能**: 执行浮点数加法。
    - **示例**:
        `VADD.F32 S0, S1, S2  ; 将S1和S2的浮点数相加,并将结果存储到S0中`
        
2. **VSUB(Vector Subtract)**
    
    - **功能**: 执行浮点数减法。
    - **示例**:
        `VSUB.F32 S0, S1, S2  ; 将S1和S2的浮点数相减,并将结果存储到S0中`
        
3. **VMUL(Vector Multiply)**
    
    - **功能**: 执行浮点数乘法。
    - **示例**:
        `VMUL.F32 S0, S1, S2  ; 将S1和S2的浮点数相乘,并将结果存储到S0中`
        
4. **VSTR(Vector Store Register)**
    
    - **功能**: 将浮点寄存器中的值存储到内存。
    - **示例**:
        `VSTR S0, [SP, #4]  ; 将S0寄存器中的浮点数存储到堆栈上的偏移地址4`
        
5. **VLDR(Vector Load Register)**
    
    - **功能**: 从内存加载一个浮点数到寄存器。
    - **示例**:
        `VLDR S0, [SP, #4]  ; 从堆栈上的偏移地址4加载一个浮点数到S0寄存器`
        
6. **VCVT(Vector Convert)**
    
    - **功能**: 执行浮点数格式转换。
    - **示例**:
        `VCVT.F64.F32 D0, S0  ; 将单精度浮点数S0转换为双精度浮点数并存储到D0中`
        

### 条件执行

在ARM指令中,许多指令可以带有条件码,以便根据条件执行。例如:

1. **ADDEQ(Add if Equal)**
    
    - **功能**: 如果条件为相等,则执行加法。
    - **示例**:
        `ADDEQ R0, R1, R2  ; 如果相等,将R1和R2的值相加,并将结果存储到R0中`
        
2. **MOVNE(Move if Not Equal)**
    
    - **功能**: 如果条件为不相等,则执行移动操作。
    - **示例**:
        `MOVNE R0, #0  ; 如果不相等,将立即数0加载到R0寄存器`

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值