ARM底层汇编基础指令

汇编语言的组成

  • 伪操作
    • 不参与程序执行,但是用于告诉编译器程序怎么编译
    • .text .global .end .if .else .endif .data
  • 汇编指令
    • 编译器将一条汇编指令编译成一条机器码,在内存里一条指令占4字节内存,一条指令可以实现一个特定的功能
  • 伪指令
    • 不是指令,看起来像是一条指令,可以实现和指令类似的功能。一条伪指令实际上可能是由多条指令共同实现
  • 注释
    • 单行注释:@
    • 多行注释:/* */
  • 条件编译
.if 0
@text
.else
@text
.endif

汇编指令的介绍

  • 基本数据操作指令
    • 数据搬移指令:=
    • 数据位移指令:<< >>
    • 数据算数运算指令:+ - * /
    • 位运算指令:$ |~ ^
    • 数据比较指令:
  • 跳转指令
  • 内存读写指令
  • 状态寄存器读写指令
  • 软中断指令

汇编指令的基本语法格式

基本格式: <opcode>{cond}{s} Rd,Rn,#oprand2
解释:opcode:指令码cond:条件码指令不加条件码,指令默认无条件执行指令加条件码,指令有条件执行s:状态位指令不加s,指令执行的结果不会影响CPSR寄存器指令加s,指令执行的结果会影响CPSR寄存器Rd:目标寄存器Rn:第一操作寄存器#oprand2:第二操作数1)立即数2)有效数:将一个数取反之后,变成立即数3)寄存器4)经过移位的寄存器注意事项:
1)汇编指令中不区分大小写
2)汇编指令不需要以;号结尾
3)<opcode>{cond}{s}:需要连在一起写
4)Rd,Rn,#oprand2:需要用逗号分隔开
5) <opcode>{cond}{s}和Rd,Rn,#oprand2需要用空格分隔开

数据搬移指令

  • 指令码:mov mvn
  • 格式:<opcode>{cond}{s} Rd,#oprand2
@代码1:mov r0,#0xf @ r0 = 0xfmov r1,#0xff@ mov r2,#0xfff @ error@ mov r3,#0xffff @ error@ mov r4,#0xfffff @ errormov r5,#0xffffffmov r6,#0xfffffffmov r7,#0xffffffff/*------------------ ------------------ ---------------*/
@ 代码2:mvn r5,#0xff  @ 0xff按位取反之后,赋值给r5mov r0,#0xff000000 @ 0xff 8mov r1,#0x1f800000 @ 0x7e  10mov r2,#0x00ffffff   @ ~r2 = 0xff000000mov r3,#0x0fffffff   @ ~r3 = 0xf0000000mov r4,#0xffffffff   @ ~r4 = 0x00000000

立即数判断

在这里插入图片描述

  • 立即数就是队#号后面的这个数有要求
  • 首先要从你判断的这个数中间找到0~0xff之间的数(需要将要判断的这个数所有的1包含)
  • 将找到的这个0~0xff之间的数,循环右移偶数位(低位移出,补到高位)
  • 如果能够得到你要判断的那个数,说明你这个数是一个立即数

示例代码

要判断的数:0xf0000 0000 0000 0000 0000 0000 0000 1111
找到0~0xff: 0xf0000 0000 0000 0000 0000 0000 0000 1111
循环右移位数:0
是否为立即数:是要判断的数:0xff0000 0000 0000 0000 0000 0000 1111 1111
找到0~0xff: 0xff
循环右移位数:0
是否为立即数:是要判断的数:0xfff0000 0000 0000 0000 0000 1111 1111 1111 
找到0~0xff: 不能
循环右移位数:
是否为立即数:不是要判断的数:0xf000000f1111 0000 0000 0000 0000 0000 0000 1111
找到0~0xff: 0xff0000 0000 0000 0000 0000 0000 1111 1111
循环右移位数:4
是否为立即数:是要判断的数:0xff0000001111 1111 0000 0000 0000 0000 0000 0000
找到0~0xff: 0xff0000 0000 0000 0000 0000 0000 1111 1111         
循环右移位数:8
是否为立即数:是要判断的数:0x1fe000000001 1111 1110  0000 0000 0000 0000 0000
找到0~0xff: 0xff0000 0000 0000 0000 0000 0000 1111 1111            
循环右移位数:11
是否为立即数:不是要判断的数:0x1f8000000001 1111 1000  0000 0000 0000 0000 0000
找到0~0xff: 0x7e0000 0000 0000 0000 0000 0000 0111 1110
循环右移位数:10
是否为立即数:是

伪指令(将非立即数保存至寄存器中)

伪指令:LDR 目标寄存器,=数值将指定的数据放在目标寄存器中ex:LDR r1,=0X12345678

移位操作指令

  • 格式:<opcode>{cond}{s} Rd,Rn,#oprand2
  • 指令码
    • lsl:逻辑左移 高位移出,低位补0
    • lsr:逻辑右移 低位移出,高位补0
    • asr:算数右移 有符号数右移,低位移出,高位补符号位
    • ror:循环右移 低位移出,补到高位

示例

	mov r0,#0xff@1.将0xff逻辑右移4位,并存入r1寄存器中lsr r1,r0,#0x4  @ r1 = r0 >> 4 =  0xf@ 0000 0000 0000 0000 0000 0000 1111 1111@ 0000 0000 0000 0000 0000 0000 0000 1111@2.将r1逻辑左移4位,并存入r2寄存器中lsl r2,r1,#0x4  @ r2 = r1 << 4 = 0xf0@ 0000 0000 0000 0000 0000 0000 0000 1111@ 0000 0000 0000 0000 0000 0000 1111 0000ldr r3,=0x800000f0@将r3寄存器中的值,算数右移4位,并存入r4寄存器中asr r4,r3,#0x4  @ r4 = 0xf800000f@ 1000 0000 0000 0000 0000 0000 1111 0000@ 1111 1000 0000 0000 0000 0000 0000 1111@将r4寄存器中的值,循环右移4位,并存入r5寄存器中ror r5,r4,#0x4  @ r5 = 0xff800000@ 1111 1000 0000 0000 0000 0000 0000 1111@ 1111 1111 1000 0000 0000 0000 0000 0000

位运算指令

  • 格式:<opcode>{cond}{s} Rd,Rn,#oprand2
  • 口诀:看到清零用& 看到置1用|
and:按位与(&)------>与0清0,与1不变
orr:按位或(|) ------>或0不变,或1置1
eor:按位异或(^) ------>异或0不变,异或1取反
bic:按位清除  ------> 哪一位写1,对应的位进行清0

示例

ldr r0,=0x12345678	@ 1> 将R0寄存器中的第[4]位清0,保持其他位不变bic r1,r0,#(0x1 << 4)and r1,r0,#(~(0x1 << 4))@ 2> 将R0寄存器中的第[7]位置1,保持其他位不变orr r2,r0,#(0x1 << 7)@ 3> 将R0寄存器中的第[31:28]位清0,保持其他位不变bic r0,#(0xf << 28)and r0,#(~(0xf << 28))@ 4> 将R0寄存器中的第[7:4]位置1,保持其他位不变orr r0,#(0xf << 4)@ 5> 将R0寄存器中的第[15:11]位修改为10101,保持其他位不变@ 先置1,在清0orr r0,#(0x1f << 11)and r0,#(~(0x1 << 12))and r0,#(~(0x1 << 14))@ 先清0,在置1 ----->重点掌握and r0,r0,#(~(0x1f << 11))orr r0,r0,#(0x15 << 11)

算数运算指令

指令码:add adc sub sbc mul
基本格式: <opcode>{cond}{s} Rd,Rn,#oprand2
add: 普通加法指令
adc:带进位加法指令
sub:普通减法指令
sbc:带借位减法指令
mul:乘法指令  格式:<opcode>{cond}{s} Rd,Rn   

示例

1.ADD:加法ex1:  mov r1,#1mov r2,#2add r3,r1,r2@r3=r1+r2ex:mov r1,#0XFFFFFFFEmov r2,#2addS r3,r1,r2@r3=r1+r2  @运算的结果影响到条件位
2.SUBmov r1,#0XFFFFFFFEmov r2,#2sub r3,r1,r2@r3=r1-r2ex2:mov r1,#0XFFFFFFFEmov r2,#2subs r3,r2,r1@r3=r2-r1 
3.ADC
mov r1,#0XFFFFFFFE
mov r2,#2ADDS r3,r2,r1 @r3=r1+r2 ADC R4,R2,#3  @R4=R2+3+cpsr(C位)  6 4.sbc:减法运算考虑条件位
mov r1,#0XFFFFFFFEmov r2,#2SUBS r3,r2,r1 @r3=R2-R1    4sbC R4,R1,#3  @R4=R1-3-CPSR(C位取反)

64位数据进行算术运算

原则:
一个 64位数保存在两个寄存器
高32位运算,低32位运算mov r1,#0XFFFFFFFE  @保存第一个数据的低32位mov r2,#2@保存第一个数据的高32位mov r3,#3 @保存第二个数据的低32位mov r4,#4 @保存第2数据的高32位@低32位运算要求影响条件位ADDS R5,R1,R3@R5保存运算后结果的低32位ADC R6,R2,R4@R6寄存器保存运算结果的高32位,需要考虑条件位

比较指令

指令码:cmp
基本格式: <opcode>{cond} Rn,#oprand2
1)比较指令没有目标寄存器
2)比较指令本质做减法运算
3)比较指令的执行结果会影响CPSR寄存器的NZCV位,不需要加s
4)比较指令需要和条件码搭配使用
5)前面所有学习的指令都属于无条件指令,比较指令属于有条件执行/*比较两个数大小第一个数比第二个数大:第一个数减第二个数第一个数比第二个数小:第二个数减第一个数*/mov r0,#0x3mov r1,#0x4cmp r0,r1subhi r0,r0,r1  @ r0 = r0 - r1subcc r1,r1,r0  @ r1 = r1 - r0

在这里插入图片描述

跳转指令

指令码:b 
格式:b {cond} 标签
b指令码:有去无回,不会保存函数的返回地址到LR寄存器中-------------------b loop------------------- loop:-------------------
/****************************************************/
指令码: bl
格式:bl{cond} 标签
bl指令码:有去有回,会保存函数的返回地址到LR寄存器中-------------------bl loop-------------------  ----->会保存函数的返回地址到LR寄存器中loop:-------------------

示例

mov r0,#0x1mov r1,#0x2bl add_func  @ 跳转到add_func标签下第一条指令执行mov r3,#0x3b stopadd_func:add r0,r0,r1mov pc,lr @手动恢复现场 pc = lr

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/125653.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

1.3.OpenCV技能树--第一单元--图像的基础操作(基础篇)

文章目录 1.文章内容来源2.图像的基本操作2.1.图像加载2.2.图像显示2.3.数据读取2.4.截取图像2.5.颜色通道提取2.5.1.保留红色处理2.5.2.保留绿色处理2.5.3.保留蓝色处理 3.易错点总结与反思 1.文章内容来源 1.题目来源: 2.资料来源:https://edu.csdn.net/skill/opencv/opencv…

网课搜题 小猿题库多接口微信小程序源码 自带流量主

多接口小猿题库等综合网课搜题微信小程序源码带流量主&#xff0c;网课搜题小程序, 可以开通流量主赚钱 搭建教程1, 微信公众平台注册自己的小程序2, 下载微信开发者工具和小程序的源码3, 上传代码到自己的小程序 源码下载&#xff1a;https://download.csdn.net/download/m0_…

计算机网络-计算机网络体系结构-物理层

目录 一、通信基础 通信方式 传输方式 码元 传输率 *二 准则 2.1奈氏准则(奈奎斯特定理) 2.2香农定理 三、信号的编码和调制 *数字数据->数字信号 数字数据->模拟信号 模拟数据->数字信号 模拟数据->模拟信号 *四、数据交换方式 电路交换 报文交换…

解密京东面试:如何应对Redis缓存穿透?

亲爱的小伙伴们&#xff0c;大家好&#xff01;欢迎来到小米的微信公众号&#xff0c;今天我们要探讨一个在面试中可能会遇到的热门话题——Redis缓存穿透以及如何解决它。这个话题对于那些渴望进入技术领域的小伙伴们来说&#xff0c;可是必备的哦&#xff01; 认识Redis缓存…

Apollo Planning2.0决策规划算法代码详细解析 (2): vscode gdb单步调试环境搭建

前言: apollo planning2.0 在新版本中在降低学习和二次开发成本上进行了一些重要的优化,重要的优化有接口优化、task插件化、配置参数改造等。 GNU symbolic debugger,简称「GDB 调试器」,是 Linux 平台下最常用的一款程序调试器。GDB 编译器通常以 gdb 命令的形式在终端…

基于SpringBoot的车辆管理系统

目录 前言 一、技术栈 二、系统功能介绍 员工信息管理 证件信息管理 车辆信息管理 事故登记管理 事故登记 保养登记 违章登记 三、核心代码 1、登录模块 2、文件上传模块 3、代码封装 前言 随着信息技术在管理上越来越深入而广泛的应用&#xff0c;管理信息系统的实…

vertx的学习总结7之用kotlin 与vertx搞一个简单的http

这里我就简单的聊几句&#xff0c;如何用vertx web来搞一个web项目的 1、首先先引入几个依赖&#xff0c;这里我就用maven了&#xff0c;这个是kotlinvertx web <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apac…

《Attention Is All You Need》论文笔记

下面是对《Attention Is All You Need》这篇论文的浅读。 参考文献&#xff1a; 李沐论文带读 HarvardNLP 《哈工大基于预训练模型的方法》 下面是对这篇论文的初步概览&#xff1a; 对Seq2Seq模型、Transformer的概括&#xff1a; 下面是蒟蒻在阅读完这篇论文后做的一…

java Spring Boot 将日志写入文件中记录

我们之前的一套操作来讲 日志都是在控制台上的 但 如果你的项目在正式环境上跑 运维人员突然告诉你说日志报错了&#xff0c;但你日志只在控制台上&#xff0c;那公司项目如果访问量很大 那你是很难在控制台上找到某一条日志的 这时 我们就可以用文件把它记下来 我们打开项目 …

华为云云耀云服务器L实例评测|安装搭建学生成绩管理系统

1.前言概述 华为云耀云服务器L实例是新一代开箱即用、面向中小企业和开发者打造的全新轻量应用云服务器。多种产品规格&#xff0c;满足您对成本、性能及技术创新的诉求。云耀云服务器L实例提供丰富严选的应用镜像&#xff0c;实现应用一键部署&#xff0c;助力客户便捷高效的在…

软技能继续挑战网络安全领域

根据 ISACA 的一份新报告&#xff0c;新的网络安全调查结果指出了网络安全专家缺乏的领域&#xff0c;其中人际技能、云计算和安全措施是网络安全专家最突出的技能缺陷。 59% 的网络安全领导者表示他们的团队人手不足。50% 的受访者表示有非入门级职位的职位空缺&#xff0c;而…

【SpringBoot】多环境配置和启动

环境分类&#xff0c;可以分为 本地环境、测试环境、生产环境等&#xff0c;通过对不同环境配置内容&#xff0c;来实现对不同环境做不同的事情。 SpringBoot 项目&#xff0c;通过 application-xxx.yml 添加不同的后缀来区分配置文件&#xff0c;启动时候通过后缀启动即可。 …