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.rhkb.cn/news/145450.html

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

相关文章

嵌入式Linux应用开发-基础知识-第十六章GPIO和Pinctrl子系统的使用

嵌入式Linux应用开发-基础知识-第十六章GPIO和Pinctrl子系统的使用 第十六章 GPIO 和 Pinctrl 子系统的使用16.1 Pinctrl 子系统重要概念16.1.1 引入16.1.2 重要概念16.1.3 示例16.1.4 代码中怎么引用pinctrl 16.2 GPIO子系统重要概念16.2.1 引入16.2.2 在设备树中指定引脚16.2…

软件设计模式系列之二十一——观察者模式

1 观察者模式的定义 观察者模式&#xff08;Observer Pattern&#xff09;是一种行为型设计模式&#xff0c;它允许对象之间建立一对多的依赖关系&#xff0c;当一个对象的状态发生变化时&#xff0c;所有依赖于它的对象都会得到通知并自动更新。这个模式也被称为发布-订阅模式…

数据结构 | 二叉树

基本形状 可参照 数据结构&#xff1a;树(Tree)【详解】_数据结构 树_UniqueUnit的博客-CSDN博客 二叉树的性质 三种顺序遍历

BUUCTF reverse wp 51 - 55

findKey shift f12 找到一个flag{}字符串, 定位到关键函数, F5无效, 大概率是有花指令, 读一下汇编 这里连续push两个byte_428C54很奇怪, nop掉下面那个, 再往上找到函数入口, p设置函数入口, 再F5 LRESULT __stdcall sub_401640(HWND hWndParent, UINT Msg, WPARAM wPara…

Kafka(一)使用Docker Compose安装单机Kafka以及Kafka UI

文章目录 Kafka中涉及到的术语Kafka镜像选择Kafka UI镜像选择Docker Compose文件Kafka配置项说明KRaft vs Zookeeper和KRaft有关的配置关于Controller和Broker的概念解释Listener的各种配置 Kafka UI配置项说明 测试Kafka集群Docker Compose示例配置 Kafka中涉及到的术语 对于…

Spring5应用之AOP切入点详解

作者简介&#xff1a;☕️大家好&#xff0c;我是Aomsir&#xff0c;一个爱折腾的开发者&#xff01; 个人主页&#xff1a;Aomsir_Spring5应用专栏,Netty应用专栏,RPC应用专栏-CSDN博客 当前专栏&#xff1a;Spring5应用专栏_Aomsir的博客-CSDN博客 文章目录 前言切入点详解切…

简单三步 用GPT-4和Gamma自动生成PPT PDF

1. 用GPT-4 生产PPT内容 我想把下面的文章做成PPT&#xff0c;请你给出详细的大纲和内容 用于谋生的知识&#xff0c;学生主要工作是学习&#xff0c;成年人的工作是养家糊口&#xff0c;这是基本的要求&#xff0c;在这之上&#xff0c;才能有更高的追求。 不要短期期望过高…

C#(CSharp)入门教程

目录 C#的第一个程序 变量 折叠代码 变量类型和声明变量 获取变量类型所占内存空间&#xff08;sizeof&#xff09; 常量 转义字符 隐式转换 显示转换 异常捕获 运算符 算术运算符 布尔逻辑运算符 关系运算符 位运算符 其他运算符 字符串拼接 …

计算机图像处理-高斯滤波

高斯滤波 高斯滤波是一种线性平滑滤波&#xff0c;适用于消除高斯噪声&#xff0c;广泛应用于图像处理的减噪过程。通俗的讲&#xff0c;高斯滤波就是对整幅图像进行加权平均的过程&#xff0c;每一个像素点的值&#xff0c;都由其本身和邻域内的其他像素值经过加权平均后得到…

Ubuntu部署运行ORB-SLAM2

ORB-SLAM2是特征点法的视觉SLAM集大成者&#xff0c;不夸张地说是必学代码。博主已经多次部署运行与ORB-SLAM2相关的代码&#xff0c;所以对环境和依赖很熟悉&#xff0c;对整个系统也是学习了几个月&#xff0c;一行行代码理解。本次在工控机上部署记录下完整的流程。 ORB-SLA…

koa基础应用

不要把koa想得太复杂&#xff0c;他就是一个Node框架而已。 在本地应用安装好Node和koa后&#xff0c;先实现一下简单的服务app.js&#xff0c;代码如下&#xff1a; const Koa require(koa) const app new Koa(); app.use(async (context) > {context.body hello Koa …

企业风险管理策略终极指南

企业风险管理不一定是可怕的。企业风险管理是一个模糊且难以定义的主题领域。它涵盖了企业的多种风险和程序&#xff0c;与传统的风险管理有很大不同。 那么&#xff0c;企业风险管理到底是什么&#xff1f;在本文中&#xff0c;我们将确定它是什么&#xff0c;提出两种常见的…

B058-SpringBoot

目录 springboot概念与作用入门案例springboot运行方式热部署配置文件Profile多环境支持整合测试-springboot-testSpringboot-web1.返回json数据2.返回页面&#xff08;模板技术&#xff09;thymeleaf1.导入thymeleaf依赖2.模板文件3.controller4.启动类 SSM整合1.导包2.项目目…

机器人中的数值优化|【四】L-BFGS理论推导与延伸

机器人中的数值优化|【四】L-BFGS理论推导与延伸 往期内容回顾 机器人中的数值优化|【一】数值优化基础 机器人中的数值优化|【二】最速下降法&#xff0c;可行牛顿法的python实现&#xff0c;以Rosenbrock function为例 机器人中的数值优化|【三】无约束优化&#xff0c;拟牛…

让大脑自由

前言 作者写这本书的目的是什么&#xff1f; 教会我们如何让大脑更好地为自己工作。 1 大脑的运行机制是怎样的&#xff1f; 大脑的基本运行机制是神经元之间通过突触传递信息&#xff0c;神经元的兴奋和抑制状态决定了神经网络的运行和信息处理&#xff0c;神经网络可以通过…

使用Qt验证RGB格式

下面我们用不同的颜色来绘制一块矩形区域&#xff0c;来对比学习RGB颜色。 一片漆黑的黑色 黑色在RGB中是三个颜色分量都是0。也就是没有颜色。 下面我们绘制一个水平100个像素&#xff0c;垂直200个像素的矩形区域&#xff0c;颜色设置为黑色。 #ifndef MAINWINDOW_H #def…

SpringBoot整合阿里云OSS文件存储解决方案

&#x1f9d1;‍&#x1f4bb;作者名称&#xff1a;DaenCode &#x1f3a4;作者简介&#xff1a;啥技术都喜欢捣鼓捣鼓&#xff0c;喜欢分享技术、经验、生活。 &#x1f60e;人生感悟&#xff1a;尝尽人生百味&#xff0c;方知世间冷暖。 &#x1f4d6;所属专栏&#xff1a;Sp…

Dink进阶之路

1、环境变量 cat /etc/profile #flink需要 export HADOOP_CLASSPATHhadoop classpath export HADOOP_CONF_DIR/etc/hadoop/conf2、Flink配置 2.1、flink-conf.yaml jobmanager.rpc.address: node-146 jobmanager.rpc.port: 6123 # 设置jobmanager总内存 jobmanager.memory.…

clip代码安装实操

CLIP模型及代码地址&#xff1a;GitHub - openai/CLIP: Contrastive Language-Image Pretraining 代码准备环境 先创建一个anaconda虚拟环境&#xff0c;包含python3.7版本&#xff0c;将该环境命名为clip。成功。 &#xff08; pytorch1.7.1 所需 python 版本 >3.6&…

React 入门笔记

前言 国庆值班把假期拆了个稀碎, 正好不用去看人潮人海, 趁机会赶个晚集入门一下都火这么久的 React 前端技术. 话说其实 n 年前也了解过一丢丢来着, 当时看到一上来就用 JS 写 DOM 的套路直接就给吓退了, 扭头还去看 Vue 了&#x1f923;, 现在从市场份额来看, 确实 React 还…