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

这篇具有很好参考价值的文章主要介绍了【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),其他位置的位不变文章来源地址https://www.toymoban.com/news/detail-756577.html

到了这里,关于【ARM系列】ARM常用汇编指令的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • ARM汇编 : 汇编指令,伪指令,汇编程序格式

    计算机的指令集一般可分为4种: 复杂指令集(CISC) 精简指令集(RISC) 显式并行指令集(EPIC) 超长指令字指令集(VLIW) ARM指令集属于RISC,RISC相对于CISC指令集,主要有以下特点: ●Load/Store架构,CPU不能直接处理内存中的数据,要先将内存中的数据Load(加载)到寄存器中

    2024年02月12日
    浏览(34)
  • 【ARM64 常见汇编指令学习 12 -- ARM 汇编函数 的学习】

    上篇文章:ARM64 常见汇编指令学习 11 – ARM 汇编宏 .macro 的学习 下篇文章:ARM64 常见汇编指令学习 13 – ARM 汇编 ORG 伪指令学习 ARM汇编中的函数定义并不像高级语言那样有特定的语法,但通常可以通过 标签(label) 和 子程序调用指令 (如BL,BLX) 来实现类似于函数的功能。 例如

    2024年02月14日
    浏览(49)
  • 【ARM64 常见汇编指令学习 14 -- ARM 汇编 .balign,.balignw,.balign 伪指令学习】

    上篇文章:ARM64 常见汇编指令学习 13 – ARM 汇编 ORG 伪指令学习 下篇文章:ARM64 常见汇编指令学习 15 – ARM 标志位的学习 .balignl 是一个伪操作符,伪操作符的意思就是机器码里,并没有一个汇编指令与其对应,是编译器来实现其功能的。. balignl 是 .balign 的变体。 .balignl 完整

    2024年02月14日
    浏览(47)
  • 【ARM64 常见汇编指令学习 16 -- ARM64 SMC 指令】

    上篇文章:ARM64 常见汇编指令学习 15 – ARM64 标志位的学习 下篇文章:ARM64 常见汇编指令学习 17 – ARM64 BFI 指令 在ARMv8架构中,同步异常主要包括以下几种: Undefined Instruction :未定义指令异常,当处理器尝试执行一条未定义的指令时会触发。 Supervisor Call (SVC) :这是一种特殊

    2024年02月13日
    浏览(49)
  • ARM64 常见汇编指令学习 11 -- ARM 汇编宏 .macro 的学习

    下篇文章:ARM64 常见汇编指令学习 12 – ARM 汇编函数 的学习 上篇文章:ARM64 常见汇编指令学习 10 – 无符号位域提取指令 BFXIL 在 ARM 汇编中,“ .macro ” 是用来定义一个宏的指令。宏可以看作是一个可以在汇编程序中重用的代码段。当调用宏时,汇编器会将宏的内容插入到调

    2024年02月14日
    浏览(47)
  • ARM 汇编比较指令-条件执行指令

    比较指令用来比较两个数大小,或者是否相等,比较指令的运算结果会影响CPSR寄存器的NZC、V标识位,具体的标志位可以参考前面的CPSR寄存器介绍,比较指令的格式如下/ CMP {cond} Rn, operand2 比较两个数大小 CMN {cond}Rn, operand2 取负比较  比较指令的使用示例及说明如下。

    2024年02月03日
    浏览(48)
  • ARM 汇编指令:(五)CMP指令

    目录 1.CMP比较指令 2.指令条件码 cond CMP指令是计算机指令集中的一种比较指令,用于比较两个操作数的大小关系或相等性,并根据比较结果设置或更新条件码寄存器(或程序状态字)的标志位。 指令格式:CMP  第一操作寄存器  第二操作数 第一操作寄存器:参与比较的第一

    2024年04月13日
    浏览(56)
  • 【理解ARM架构】不同方式点灯 | ARM架构简介 | 常见汇编指令 | C与汇编

    🐱作者:一只大喵咪1201 🐱专栏:《理解ARM架构》 🔥格言: 你只管努力,剩下的交给时间! 在学习C语言的时候,我们会写个 Hello World 程序来入门,当我们写ARM程序,也该有一个简单的程序引领我们入门,这个程序就是点亮LED。 查看原理图,确定控制LED的引脚: 如上图是

    2024年02月05日
    浏览(48)
  • ARM官方汇编指令

    以下内容源于网络资源的学习与整理,如有侵权请告知删除。 参考内容 (1)文档《ARM汇编指令集汇总》 (2)文档《ARM汇编手册》 (3)文档《 ARM Software Development Toolkit User Guide 》 内容总结 1、本文详细说明了ARM官方汇编指令的用法,包括以下几类: 指令类型 指令 备注 数

    2024年02月06日
    浏览(50)
  • ARM-汇编指令

    链接脚本文件 作用:给编译器进行使用,告诉编译器各个段,如何进行分布 1.汇编指令:编译器将一条编译指令编译生成机器码,占用代码段空间 2.伪指令:伪指令本身不是一条指令,编译器可以将器编译生成多条指令,共同完成一条指令功能 3.伪操作:指导编译器对代码如

    2024年02月11日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包