【ARM系列】ARM常用汇编指令

前言

在调试芯片启动代码或者分析ARM core运行流程的过程中,尝尝需要对照软件代码的反汇编文件进行分析,因此有必要掌握一些常用的arm汇编指令。

数据传送指令

MOV

指令格式:MOV{条件}{S} 目的寄存器,源操作数
指令含义:将源操作数赋值给目的寄存器。源操作数可以是寄存器,立即数或带移位的寄存器
指令实例:
mov x0,#15 //将立即数15赋值给寄存器x0
mov x19,x0//将寄存器x0的值赋值给寄存器x19

算数运算指令

ADD(不带进位加法指令)

ADD{条件}{S} 目的寄存器,操作数1,操作数2
指令含义:ADD指令实现两个寄存器或寄存机或寄存器与立即数的相加
指令实例:
add x0,x1,x2 //x0<=x1+x2
add x3,x3,#1 //x3=x3+1
add x0,x22,x2,lsl #3 //x0<=x22+(x2<<3)

SUB(不带进位减法指令)

指令格式:SUB{条件}{S} 目的寄存器,操作数1,操作数2
指令含义:SUB指令实现两个寄存器或寄存机或寄存器与立即数的相减
指令实例:
sub x3,x3,x2 //x3<=x3-x2
sub x3,x5,#1 //x3<=x5-1
sub x0,x0,x19,lsl #14 //x0<=x0-(x19<<14)

MUL(32位乘法指令)

指令含义:实现两个寄存器的相乘
指令实例:
mul x3,x2,x0 //x3<=x2*x0

比较和跳转指令

CMP(直接比较指令)

指令格式:CMP{条件} 操作数1,操作数2
指令含义:将一个寄存器的内容与另一个寄存器或立即数进行比较,同时更新条件标志位的值

BEQ

指令含义:跳转(如果比较结果相等),通常和CMP搭配使用

BNQ

指令含义:跳转(如果比较结果不相等),通常和CMP搭配使用
指令实例:
ldr x1,=Image$$ARM_LIB_SRACKHEAP$$ZI$$Limit
lsl w2,w1,#12
cmp w2,#0
b.eq 1f

B

指令格式:CMP{条件} label
指令含义:跳转指令,跳转至指定的地址执行程序
指令实例:
b __main //跳转到__main
b . //原地跳转

BL

指令格式:CMP{条件} label
指令含义:带链接的跳转指令,指令将下一条指令的地址拷贝到LR中,然后跳转到指令地址运行程序
指令实例:
bl GetCPUID //跳转到GetCPUID执行程序

加载-存储指令

LDR

指令格式:LDR{条件} 目的寄存器,<内存地址>
指令含义:将内存地址中将一个32bit的字数据加载到寄存器中
指令实例:
ldr x0,[x1] //将x1寄存器的值作为内存地址,把该地址的值加载到x0寄存器
ldr x1,=el1_vectors //将el1_vectors的地址加载到x1寄存器
ldr x0,=Image$$ARM_LIB_STACK$$ZI$$Limit //将栈顶地址加载到寄存器x0

STR

指令格式:STR{条件} 源寄存器,<内存地址>
指令含义:将源寄存器中的一个32bit的字数据存储到内存中
指令实例:
str x0,[x1] //将x0寄存器的内容存储到x1寄存器的值对应的内存地址空间
str x1,[x0],#8 //将x1寄存器的内容存储到x0寄存器的值对应的内存地址空间,同时x0寄存器内容更新为x0+8
str x1,[x24,x2,lsl #3] //将x1寄存器的内容存储到(x24+x2<<3)值对应的内存地址空间

移位指令

LSL

指令含义:逻辑左移指令,实现将寄存器进行左移操作
指令实例:
lsl w2,w1,#12 //w2<=w1<<12

LSR

指令含义:逻辑右移指令,实现将寄存器进行右移操作
指令实例:
lsr x1,x1,#44 //x1<=x1>>44

系统寄存器访问指令

MSR

指令格式:MSR{条件} 系统寄存器,操作数
指令含义:将操作数的内容传输到系统寄存器中。操作数可以是寄存器,立即数
指令实例:
msr DAIFClr,#0xF //Enable interrupt
msr SCTLR_EL1,x1 //将x1的值写入系统寄存器SCTLR_EL1

MRS

指令格式:MRS{条件} 通用寄存器,程序状态寄存器
指令含义:将程序状态寄存器的值读取到通用寄存器
指令实例:
mrs x0,MPIDR_EL1 //获取MPIDR_EL1的值,存放在x0中

逻辑运算指令

AND(逻辑与指令)

指令格式:AND{条件}{S} 目的寄存器,操作数1,操作数2
指令含义:将两个操作数进行逻辑与操作,结果存放到目的寄存器,操作数1必须是寄存器,操作数2可以是寄存器,被移位的寄存器,立即数。常用于屏蔽操作数1的某些bit。
指令实例:
and x0,x0,#3 //将x0寄存器的bit0,bit1保持,其他bit清零

ORR(逻辑或指令)

指令格式:ORR{条件}{S} 目的寄存器,操作数1,操作数2
指令含义:将两个操作数进行逻辑或操作,结果存放到目的寄存器,操作数1必须是寄存器,操作数2可以是寄存器,被移位的寄存器,立即数
指令实例:
orr x0,x0 #(1<<10) //将x0寄存器的bit10置1,其他bit保持

BIC(位清除指令)

指令格式:BIC{条件}{S} 目的寄存器,操作数1,操作数2
指令含义:实现清除操作数1的某些bit,操作数1必须是寄存器,操作数2可以是寄存器,被移位的寄存器,立即数。操作数2是32bit的掩码,如果设置了某一位,则清除该位,未设置的保持
指令实例:
bic x0,x0,#(1<<12) //将x0寄存器的bit 12进行清零,其他位不变
bic x1,x2,x3 //将x3的反码与x2进行逻辑与,结果保存到x1

UBFX

指令格式:UBFX Wd,Wn,#lsb,#width 32bit; UBFX Xd,Xn,#lsb,#width 64bit
指令含义:无符号位域提取指令,从Wn寄存器第lsb位开始,提取width位到Wd寄存器,剩余高位用0填充。
指令实例:
mrs x0,MPIDR_EL1
ubfx x0,x0,#16,#8 //抽取x0寄存器[23:16]并赋值给x0寄存器

BFI

指令格式: BFI 目标寄存器,源寄存器,lsb,宽度
目标寄存器:将被插入位字段的寄存器。
源寄存器:包含要插入的位字段的寄存器。
lsb:在目标寄存器中插入位字段的最低位的位置。
宽度:要插入的位字段的宽度。

指令实例:
BFI x0, x1, #4, #8 //将x1寄存器的最低8-bit插入到x0寄存器的从第4-bit开始的8-bit(即bit 4 — bit 11),其他位置的位不变

  • 6
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值