arm汇编

arm汇编

寄存器

sp: (Stack Pointer),栈顶寄存器,用于保存栈顶地址

fp(x29): (Frame Pointer)为栈基址寄存,用于保存栈底地址

lr(x30): (Link Register) ,保存调用跳转指令 bl 指令的下一条指令的内存地址

zr(x31): (Zero Register),xzr/wzr分别代表 64/32 位,其作用就是 0,写进去代表丢弃结果,读出来是 0

pc: 保存将要执行的指令的地址(有操作系统决定其值,不能改写)。

指令

add

将某一寄存器的值和另一寄存器的值 相加 并将结果保存在另一寄存器中,如:

add x0, x0, #1    ; 将寄存器 x0 的值和常量 1 相加后保存在寄存器 x0 中
add x0, x1, x2    ; 将寄存器 x1 和 x2 的值相加后保存到寄存器 x0 中
add x0, x1, [x2]  ; 将寄存器 x1 的值加上寄存器 x2 的值作为地址,再取该内存地址的内容放入寄存器 x0 中

mov

把一个寄存器的值(要能用立即数表示)赋给另一个寄存器,或者将一个常量赋给寄存器,将后边的量赋给前边的量

指令示例:

MOV R1,R0   ;将寄存器R0的值传送到寄存器R1
MOV PC,R14   ;将寄存器R14的值传送到PC,常用于子程序返回
MOV R1,R0,LSL#3 ;将寄存器R0的值左移3位后传送到R1(即乘8)
MOVS PC, R14   ;将寄存器R14的值传送到PC中,返回到调用代码并恢复标志位

sub

SUB指令用于把操作数1减去操作数2,并将结果存放到目的寄存器中。操作数1应是一个寄存器,操作数2可以是一个寄存器,被移位的寄存器,或一个立即数。该指令可用于有符号数或无符号数的减法运算

指令示例:

SUB  R0,R1,R2           ; R0 = R1 - R2
SUB  R0,R1,#256         ; R0 = R1 - 256
SUB  R0,R2,R3,LSL#1    ; R0 = R2 - (R3 << 1)

and

ND指令用于在两个操作数上进行逻辑与运算,并把结果放置到目的寄存器中。操作数1应是一个寄存器,操作数2可以是一个寄存器,被移位的寄存器,或一个立即数。该指令常用于屏蔽操作数1的某些位。

指令示例:

AND  R0,R0,#3        ; 3(0011) 该指令保持R0的0、1位,其余位清零。

stp

入栈指令(str 的变种指令,可以同时操作两个寄存器)

stp x29, x30, [sp, #0x10]    ; 将 x29, x30 的值存入 sp 偏移 16 个字节的位置

ldp

出栈指令(ldr 的变种指令,可以同时操作两个寄存器)

ldp x29, x30, [sp, #0x10]    ; 将 sp 偏移 16 个字节的值取出来,存入寄存器 x29 和寄存器 x30

blr

跳转到 某寄存器 (的值)指向的地址(有返回),先将下一指令地址(即函数返回地址)保存到寄存器 lr (x30)中,再进行跳转

blr x20       ; 先将下一指令地址(x20 指向的函数调用后的返回地址)保存到寄存器 lr 中,然后再调用 x20 指向的函数
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值