ARM64常用汇编

参考:https://blog.csdn.net/chi_wy/article/details/86236735

ARM64取消32位的LDM, STM, PUSH, POP指令. 与之替代的是 ldr/ ldp, str/ stp
ARM64里面 对栈的操作都是16进制对齐

ARM64下, 参数都是保存在x0-x7 (w0-w7) 这8个寄存器中, 如果超过这8个参数就会入栈, 函数的返回值是放在 x0寄存器中.
对于ARM32架构,函数调用时前4个参数用通用寄存器(R0-R3),剩余的用栈。

函数的局部变量都是保存在栈里面.

栈就是指令执行时存放临时变量的内存空间,具有特殊的访问方式:后进先出, Last In Out Firt。

栈是从高地址到低地址存储数据的,栈底是高地址,栈顶是高地址。

FP指向栈底
SP指向栈顶

MOV

MOV X1,X0 ; 将寄存器X0的值传送到寄存器X1

STR

(store register)写入指令
将数据从寄存器中读出来, 写入到内存中

STR(条件) 源寄存器,<存储器地址>
STR R0, [R1] ,意思是R0-> [R1],源寄存器写在前面,跟MOV、LDR都相反。

ldr

(load register)读取指令
将数据从内存中读取出来, 存到寄存器中,LDR:通常都是作加载指令的,但是它也可以作伪指令

 LDR r0,[r1]        //将R1中的值存到r0中
 LDR r1,[r2,#16]     //将(r2+16)地址中的内容存到r1中
 LDR r1,[r2],#4      //将r2地址中的内容存到r1中,同时r2=r2+4

ldp/stp

ldr/str 的衍生, 可以同时读/写两个寄存器, ldr/str只能读写一个

sub sp, sp, #0x20 ; 拉伸栈空间32(20 = 2*16)个字节
stp x0 , x1, [sp, #0x10] ; sp往上加16(10 = 1 * 16)个字节,存放x0 和 x1
ldp x1 , x0, [sp, #0x10] ; 将sp偏移16个字节的值取出来,放入x1 和 x0

CMP

cmp是比较指令,cmp的功能相当于减法指令。它不保存结果,只是影响相应的标志位

cmp指令格式:   cmp   操作对象1, 操作对象2
     mov al, 05h
     mov bl, 08h
     cmp al, bl   (al - bl = -3h)

bl

跳转指令

ret

返回指令
ret {Xm}:跳转到由Xm目标寄存器指定的地址处。

其他

e : equal
ne : not equal
b: below
nb : not below
a : above
na : not above
### ARM架构常用汇编指令列表 以下是ARM架构中常用汇编指令及其功能描述: #### 数据传送指令 - **LDR** (Load Register): 将数据从内存加载到寄存器中[^3]。 - `LDR R0, [R1]` 表示将地址由寄存器R1指向的内容加载到R0中。 - 后缀支持:`LDRB` 加载单字节,`LDRH` 加载半字。 - **STR** (Store Register): 将寄存器中的数据存储到内存中[^3]。 - `STR R0, [R1]` 表示将寄存器R0的值存储到由R1指定的内存位置。 - 后缀支持:`STRB` 存储单字节,`STRH` 存储半字。 #### 数据处理指令 - **ADD** (Addition): 执行加法运算并更新目标寄存器[^3]。 - 示例:`ADD R0, R1, R2` 表示将R1和R2相加的结果存入R0。 - **SUB** (Subtraction): 执行减法运算并更新目标寄存器。 - 示例:`SUB R0, R1, R2` 表示计算R1-R2并将结果存入R0。 - **MUL** (Multiplication): 实现乘法操作[^2]。 - 示例:`MUL R0, R1, R2` 表示将R1和R2相乘的结果存入R0。 - **UDIV / SDIV**: 分别执行无符号整数除法和有符号整数除法[^2]。 #### 逻辑操作指令 - **AND** (Bitwise AND): 对两个操作数进行按位与操作。 - 示例:`AND R0, R1, R2` 表示对R1和R2进行按位与操作,并将结果存入R0。 - **ORR** (Bitwise OR): 对两个操作数进行按位或操作[^2]。 - 示例:`ORR R0, R1, R2` 表示对R1和R2进行按位或操作,并将结果存入R0。 - **EOR** (Exclusive OR): 对两个操作数进行按位异或操作。 - 示例:`EOR R0, R1, R2` 表示对R1和R2进行按位异或操作,并将结果存入R0。 - **BIC** (Bit Clear): 清除特定比特位的操作。 - 示例:`BIC R0, R1, #mask` 表示清除R1中被掩码覆盖的部分,并将结果存入R0。 #### 移位指令 - **LSL** (Logical Shift Left): 左移操作。 - 示例:`LSL R0, R1, #n` 表示将R1向左移动n位,并将结果存入R0。 - **LSR** (Logical Shift Right): 右移操作[^2]。 - 示例:`LSR R0, R1, #n` 表示将R1向右移动n位,并将结果存入R0。 #### 控制流指令 - **BL** (Branch and Link): 跳转至子程序并保存返回地址。 - 示例:`BL function_name` 表示调用函数function_name,并在完成后自动返回。 - **PUSH** 和 **POP**: 栈操作指令,分别用于压栈和弹栈[^3]。 - 示例:`PUSH {R0-R3}` 表示将寄存器R0到R3的值压入堆栈;`POP {R0-R3}` 则是从堆栈恢复这些值。 - **B** (Branch): 条件或无条件分支跳转。 - 示例:`B label` 表示无条件跳转到标签label处继续执行。 - **CMP** (Compare): 比较两个操作数并设置状态标志位[^2]。 - 示例:`CMP R0, R1` 表示比较R0和R1的大小关系,并影响CPSR的状态标志。 --- ```assembly ; 示例代码片段展示部分常见指令 MOV R0, #10 ; 将立即数值10赋给R0 ADD R1, R0, #5 ; 计算R0+5并将结果存入R1 SUB R2, R1, #3 ; 计算R1-3并将结果存入R2 MUL R3, R2, R0 ; 计算R2*R0并将结果存入R3 STR R3, [R4] ; 将R3的值存储到由R4指向的内存地址 LDR R5, [R4] ; 从R4指向的内存地址加载数据到R5 ``` --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值