前言
在调试芯片启动代码或者分析ARM core运行流程的过程中,尝尝需要对照软件代码的反汇编文件进行分析,因此有必要掌握一些常用的arm汇编指令。
数据传送指令
MOV
指令格式:MOV{条件}{S} 目的寄存器,源操作数
指令含义:将源操作数赋值给目的寄存器。源操作数可以是寄存器,立即数或带移位的寄存器
指令实例:mov x0,#15
//将立即数15赋值给寄存器x0mov x19,x0
//将寄存器x0的值赋值给寄存器x19
算数运算指令
ADD(不带进位加法指令)
ADD{条件}{S} 目的寄存器,操作数1,操作数2
指令含义:ADD指令实现两个寄存器或寄存机或寄存器与立即数的相加
指令实例:add x0,x1,x2
//x0<=x1+x2add x3,x3,#1
//x3=x3+1add x0,x22,x2,lsl #3
//x0<=x22+(x2<<3)
SUB(不带进位减法指令)
指令格式:SUB{条件}{S} 目的寄存器,操作数1,操作数2
指令含义:SUB指令实现两个寄存器或寄存机或寄存器与立即数的相减
指令实例:sub x3,x3,x2
//x3<=x3-x2sub x3,x5,#1
//x3<=x5-1sub 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
//跳转到__mainb .
//原地跳转
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+8str 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 interruptmsr 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:在目标寄存器中插入位字段的最低位的位置。
宽度:要插入的位字段的宽度。文章来源:https://www.toymoban.com/news/detail-756577.html指令实例:
BFI x0, x1, #4, #8
//将x1寄存器的最低8-bit插入到x0寄存器的从第4-bit开始的8-bit(即bit 4 — bit 11),其他位置的位不变文章来源地址https://www.toymoban.com/news/detail-756577.html
到了这里,关于【ARM系列】ARM常用汇编指令的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!