汇编基础语法

news2024/11/17 19:24:55

指令格式

1、立即数

一个常数,该常数必须对应8位位图,即一个8位的常数通过循环右移偶数位得到该数,该数位合法立即数

在指令中表示方法:#数字,例如:#100

快速判定是否是合法立即数:

首先将这个数转换为32bit的16进制形式,例如218=0xDA=0x000000DA

①除零外,仅有一位数为合法立即数

②除零外,仅有二位数,并且相邻(包括首尾)的为合法立即数

③除零外,仅有三位数,并且相邻(包括中间有0,例如0x10800000,包括首尾相邻),这三位数中,第一位仅能为1、2、3最低位仅能为4、8、c,中间位0x0~0xf

这种组合的为合法立即数

2、寄存器移位

将寄存器值读取后,进行移位运算后,作为操作数2参与运算。支持的移位方式如下:

LSL(Logical Shift Left) 逻辑左移

LSR(Logical Shift Right)逻辑右移

ASR(Arithmetic Shift Right)算术右移

r0,lsr #4 表示r0>>4
r0,lsr r1 表示r0>>r1
#3,lsl #4 错误,只能是寄存器移位,不能是立即数移位

常用ARM核指令

1、数据传送指令

(1)MOV指令

格式:mov 目标寄存器,操作数
功能:将操作数的值赋值给目标寄存器
mov r0,#12
mov r1,r0
mov r1,r0,lsl #2 //r1=r0<<2

(2)MVN指令

格式:mvn 目标寄存器,操作数2
功能:将操作数2取反的值给目标寄存器
mvn r0,#0 //r0=~0  =>r0=0xffff,ffff

(3)LDR指令

格式:LDR 目标寄存器,数据
功能:完成任意的数据传送到目标寄存器
注意:数据前面不能加#,因为此时数据不按立即数来处理
举例:
LDR r0,=0x12345678

2、数据计算指令

(1)ADD指令

格式:add 目标寄存器,操作数1,操作数2
功能:将操作数1加上操作数2的结果放在目标寄存器中
举例:
add r0,r1,#3 //r0=r1+3
add r0,r1,r2//r0=r1+r2
add r0,r1,r2,lsl #2//r0=r1+( r2<<2 )

(2)SUB指令

格式:sub 目标寄存器,操作数1,操作数2
功能:将操作数1减去操作数2的结果放在目标寄存器中

(3)MUL指令

格式:mul 目标寄存器,操作数1,操作数2
功能:将操作数1乘以操作数2的结果放在目标寄存器中
注意:操作数1和操作数2必须都是寄存器,并且操作数1的寄存器编号不能和目标寄存器一样
举例:mul r0 ,r0 ,#3//error r0=r0*3

3、位运算指令

(1)AND指令

格式:and 目标寄存器,操作数1,操作数2
功能:将操作数1按位与操作数2,结果放在目标寄存器中

(2)ORR指令

格式:orr 目标寄存器,操作数1,操作数2
功能:将操作1按位或操作2的结果存放在目标寄存器中
举例:orr r0,r1,r2 //r0=r1|r2
     orr r0,r1,#10 //r0=r1|10
     orr r0,r1,r2,lsl #2 //r0=r1|(r2<<2)

(3)EOR指令

格式:eor 目标寄存器,操作1,操作2
功能:将操作数1按位异或操作数2的结果存放在目标寄存器中
举例:
eor r0,r1,r2//r0=r1^r2
eor r0,r1,#10//r0=r1^10
eor r0,r1,r2,lsl #2 //r0=r1^(r2<<2)

(4)BIC指令

格式:bic目标寄存器,操作1,操作2
功能:将操作数1按位与操作数2取反的结果存放在目标寄存器中
目标寄存=操作数1& ~操作数2

将0x55中所有的1位清零

.global _start
	
_start:
   mov r0,#0x55  @ 0101 0101
   bic r1,r0,#0x55
stop:
	b stop
	

4、比较指令

格式:cmp 寄存器 ,操作数2
功能:将寄存器的值与操作2比较,比较的结果会自动影像CPSR的NZCV

 .global _start
_start:
   mov r0,#10
   mov r1,#20
   cmp r0,r1
   addgt r0,r0,#1 //如果r0>r1 则执行这行代码
   

   
stop:
	b stop
	

在这里插入图片描述

5、跳转指令

格式:B/BL  标签
功能:跳到一个指定的标签,BL跳转之前,将跳转前PC的值保存在LR,跳转范围+/- 32M

.global _start
_start:
   mov r0,#10
   mov r1,#20
   b add_label //跳到add_label标签,然后并不会执行下面的语句
   mov r3,#10

   
stop:
	b stop
	
add_label:
   add r0,r0,r1

如果跳转之后,还想跳转回来,有两种办法

①使用bl指令,因为bl跳转之前,将跳转前的pc的值保存在lr,跳转范围+/-32M

.global _start
_start:
   mov r0,#10
   mov r1,#20
   bl add_label
   mov r3,#10

   
stop:
	b stop
	
add_label:
   add r0,r0,r1
   mov pc,lr

②使用ldr直接赋值

.global _start
_start:
   mov r0,#10
   mov r1,#20
   ldr pc,=add_label //直接给pc赋值
back_label:
   mov r3,#10

   
stop:
	b stop
	
add_label:
   add r0,r0,r1
   ldr pc,=back_label //给需要跳转回来的标签赋值

练习:实现1-100累加和

.global _start
_start:
   mov r0,#0
   mov r1,#1

   
loop:
   add r0,r0,r1 //r0=r0+r1
   add r1,r1,#1 //r1+1
   cmp r1,#100 //r1与100比较
   ble  loop //r1<=100则跳进循环loop
   
stop:
	b stop
	

6、内存访问指令

LDR 将内存中的值加载到寄存器中(读内存)
STR 将寄存器中的值写入内存中(写内存)

寄存器间接寻址:寄存器的值是一个地址
LDR r0,[r1] //r0=*r1
STR r0,[r1] //*r1=r0
.global _start
_start:
   mov r0,#0x40000000
   ldr r1,=0x12345678
   str r1,[r0]
   ldr r3,[r0]
  
stop:
	b stop
	

在debug->memory map中设置读写内存

0x40000000,0x4000ffff

在这里插入图片描述

在这里插入图片描述

基址变址寻址
A.前索引
STR r0,[r1,#4]//*(r1+4)=r0  =>地址先+4在赋值
LDR r0,[r1,#4]//r0=*(r1+4)  =>地址先+4在写入寄存器中 
r1的值不变

B.后索引
STR r0,[r1],#4  //*r1=r0&&r1=r1+4  =>先写入内存,内存地址再+4
LDR r0,[r1],#4  //r0=*r1 &&r1=r1+4 =>先从内存中读取,内存地址在+4
r1的值改变

C.自动索引
STR r0,[r1,#4]! //*(r1+4)=r0 &&r1=r1+4 =>将r0中的值写入到(r1+4)中并且内存地址+4

LDR r0,[r1,#4]! //r0=*(r1+4)&&r1=r1+4 =>将内存地址+4的值赋值给r0,并且内存地址+4

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

多个数据访问

LDM 将一块内存的数据,加载到多个寄存器中
STM 将多个寄存器的值,存储到一块内存
格式:
    LDM{条件} <MODE> 基址寄存器{!},{Reglist}^
    STM{条件} <MODE> 基址寄存器{!},{Reglist}^
参数:
   MODE:-IA 后增加地址
        -IB 先增加地址
        -DA 后减少地址
        -DB 先减少地址
   基址寄存器:用来存放内存的起始地址
   !:最后更新基址寄存器的值
   Reglist:多个寄存器,从小到大,中间用','隔开 如{r0,r1,r3} 或{r0-r2}
   ^:它存在,如果reglist没有pc的时候,这个时候如果操作的寄存器是用户模式下的寄存器,在LDM指令中,有pc的时候,在数据传送的时候,会将SPSR的值拷贝到CPSR,用于异常的返回

在这里插入图片描述

栈操作指令:

进栈:stmfd sp!,{寄存器列表}

​ ldmfd sp!,{寄存器列表}

注意:在对栈操作之前,必须先设置sp的值,进栈和出栈的方式一样,ATPCS标准规定满减栈(从高往低)

在这里插入图片描述

.global _start
	@0x40000000,0x4000ffff
_start:
   ldr sp,=0x4000fff0  //设置高位
   mov r0,#0x11
   mov r1,#0x22
   mov r2,#0x33
   stmfd sp!,{r0,r1,r2} //从高位先入栈
   mov r0,#0
   mov r1,#0
   mov r2,#0
   ldmfd sp!,{r0,r1,r2}
   

   
stop:
	b stop
	

7、CPSR/SPSR操作指令

读操作:MRS rn ,CPSR/SPSR

​ 将状态寄存器的值,读到通用寄存器中

写操作:MSR CPSR/SPSR,rn

​ 将通用寄存器的值,写到状态寄存器中

汇编与C混合编程

汇编内嵌C

.global _start
	@0x40000000,0x4000ffff
_start:  
   mov r0,#2
   mov r1,#3
   ldr sp,=0x4000fff0 //设置栈sp指针的偏移量
   bl add
   
stop:
	b stop
	

int add(int a ,int b){
	int c=a+b;
	return c;
}

C内嵌汇编

asm(
"指令1\n"
"指令2\n"
...
:输出列表
:输入列表
:修改列表(通用的寄存器)
);
指令:ARM汇编指令
输出列表:将内嵌汇编中的寄存器值输出到c变量中
输入列表:将C变量输入到内联汇编中使用的寄存器
修改列表:内联汇编中修改的寄存器
修饰符说明
被修饰的操作符是只读的
=被修饰的操作符是只写的
+被修饰的操作符具有可读写的属性
&被修饰的操作符只能作为输出
.global _start
	@0x40000000,0x4000ffff
_start:  
   mov r0,#2
   mov r1,#3
   ldr sp,=0x4000fff0
   bl add
   
stop:
	b stop
	

int add(int a ,int b){
int c;
	asm(
	"add r0 %1,%2\n",
	"mov %0,r0\n"
	//从输出列表到输入列表开始编号
	:"=r"(c)//%0
	:"r"(a),"r"(b) //%1 %2
	:"r0"
	);
	
	return c;
}

ARM的异常源

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

一款可以编辑SVG矢量图形的方法(以桑基图为例)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 一、svg矢量图片在线绘制网站二、保存SVG格式图片二、修改SVG图片中的字体大小一、svg矢量图片在线绘制网站 提示:有些图不想用代码出图时,可以采用这个网站,无需注册,无VIP: 网站地址https…

FFmpeg视频处理工具安装使用

一、前言 FFmpeg是流行的开源视频处理工具&#xff0c;用于转码、合并、编辑等。以下是安装和使用方法&#xff1a; 二、步骤 1.下载 1.1 ffmpeg下载 官网下载地址 wget https://www.ffmpeg.org/releases/ffmpeg-6.1.1.tar.xz1.2 nasm下载 https://www.nasm.us/pub/nasm/…

桥感应加热主电路拓扑结构及控制原

1 桥感应加热主电路拓扑结构及控制原理 1.1 主电路拓扑 本文所述中频感应加热电源采用交—直—交的变频原理&#xff0c;三相50Hz的正弦交流输入电压经过整流滤波为540V平滑直流电压&#xff0c;再经逆变器将直流电压变成不同频率的交流电压供负载使用。本文采用半桥串联谐振…

【echarts】如何关闭dataZoom-silder 组件中数据阴影(缩略图、数据走势图)

echarts开启 “滑动条型数据区域缩放组件&#xff08;dataZoomInside&#xff09;”后&#xff0c;默认会显示数据的走势图。 但有时候我们并不需要。 如何关闭呢&#xff1f; 官方有提供一个属性&#xff1a;showDataShadow https://echarts.apache.org/zh/option.html#da…

无线物联网题集

测试一 未来信息产业的发展在由信息网络向 全面感知和 智能应用两个方向拓展、延伸和突破。 各国均把 物联网作为未来信息化战略的重要内容,融合各种信息技术,突破互联网的限制,将物体接入信息网络。 计算机的出现,开始了第四次工业革命,开始了人机物的高度融合&#xff08;&…

【Unity】 HTFramework框架(五十二)使用 HybridCLR 热更新

更新日期&#xff1a;2024年7月1日。 Github源码&#xff1a;[点我获取源码] Gitee源码&#xff1a;[点我获取源码] 索引 HybridCLR 热更新一、启用宏定义二、导入HybridCLR三、设置热更新程序集四、资源、代码热更 HybridCLR 热更新 HybridCLR是一个特性完整、零成本、高性能…

探索 ONLYOFFICE 8.1:云端协作的新纪元

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

如果对方没做幂等!记一次生产订单重复的反思

最近公司公司的旧系统中发现了一个bug。业务部门反馈&#xff0c;尽管用户只支付了一年的服务费用&#xff0c;系统却将有效期增加了两年。 原因分析&#xff1a; 到底是什么原因呢&#xff1f; 经过日志分析&#xff0c;发现消息队列&#xff08;MQ&#xff09;向第三方服务发…

EDI是什么?与ERP有何关系

EDI的发展过程 电子数据交换&#xff08;Electronic Data Interchange&#xff0c;EDI&#xff09;是一种通过电子方式传输商业文件的技术。EDI的历史可以追溯到20世纪60年代&#xff0c;当时企业开始使用计算机进行数据处理。最早的EDI系统是为解决大型企业间的信息交换问题而…

【刷题汇总--数字统计、两个数组的交集、点击消除(栈)】

C日常刷题积累 今日刷题汇总 - day0011、数字统计1.1、题目1.2、思路1.3、程序实现 2、两个数组的交集2.1、题目2.2、思路2.3、程序实现 3、点击消除(栈)3.1、题目3.2、思路3.3、程序实现 今日刷题汇总 - day001 1、数字统计 1.1、题目 请统计某个给定范围[L, R]的所有整数中…

智能制造企业CRM系统推荐清单(2024版)

当前&#xff0c;CRM市场呈现出“国际龙头优势逐渐下降&#xff0c;国产CRM奋起直追”的格局。智能制造企业在选型CRM时&#xff0c;如何选择合适的系统是一个需要重视的课题。 在我们之前的文章《一文读懂CRM&#xff0c;2023年30家CRM系统对比&#xff08;近年最全&#xf…

如何在AWS上使用免费的服务器

要在AWS上免费使用的服务器&#xff0c;你可以按照以下步骤操作&#xff1a; &#xff08;1&#xff09;注册AWS账户&#xff1a; 访问AWS官方网站&#xff08;https://aws.amazon.com/cn/&#xff09;&#xff0c;点击右上角的“完成注册”&#xff0c;按照页面提示填写相关…

经典小游戏(一)C实现——三子棋

switch(input){case 1:printf("三子棋\n");//这里先测试是否会执行成功break;case 0:printf("退出游戏\n");break;default :printf("选择错误&#xff0c;请重新选择!\n");break;}}while(input);//直到输入的结果为假&#xff0c;循环才会结束} …

基于FreeRTOS+STM32CubeMX+LCD1602+MCP23S09(SPI接口)的I/O扩展器Proteus仿真

一、仿真原理图: 二、运行效果: 三、STM32CubeMX配置: 1)、GPIO配置: 2)、SPI配置: 四、部分软件: 1)、主函数: /* USER CODE BEGIN Header */ /** ****************************************************************************** * @file : mai…

游戏AI的创造思路-技术基础-关于艾宾浩斯遗忘曲线的迷思

对于艾宾浩斯遗忘曲线和函数&#xff0c;我一直都有小小的迷思&#xff0c;总想实验下用艾宾浩斯函数来替换sigmoid函数作为激活函数&#xff0c;打造更接近人类的AI算法&#xff0c;这篇文章旨在讨论下 目录 3.10. 艾宾浩斯曲线 3.10.1. 定义 3.10.1.1. 曲线计算公式 3.10…

想用AI高端算力训练模型?试试英智BayStone平台

随着生成式人工智能的迅猛增长&#xff0c;各大公司纷纷推出强大的 AI产品以提升自身核心竞争力&#xff0c;对于依赖基础模型进行推理训练&#xff0c;同时需要高级基础设施的人工智能初创企业&#xff0c;急需使用高端智算算力来加速模型训练与产品研发创新。 算力是否充足&…

测试接口的完整流程

背景 今天睿哥给我布置了一个任务&#xff0c;叫我学习一下如何测试接口。 然后我就上网搜索去了解了一下&#xff0c;看看测试接口是什么。看了很久之后&#xff0c;我大概对接口测试有了一定的理解。 通俗来说&#xff0c;接口测试就是使用某种工具模拟客户端发送http请求…

Github 上 Star 数最多的大模型应用基础服务 Dify 深度解读(一)

背景介绍 接触过大模型应用开发的研发同学应该都或多或少地听过 Dify 这个大模型应用基础服务&#xff0c;这个项目自从 2023 年上线以来&#xff0c;截止目前&#xff08;2024-6&#xff09;已经获得了 35k 多的 star&#xff0c;是目前大模型应用基础服务中最热门的项目之一…

HEC-HMS水文模型教程

原文链接&#xff1a;HEC-HMS水文模型教程https://mp.weixin.qq.com/s?__bizMzUzNTczMDMxMg&mid2247607904&idx5&sn1a210328a3fc8f941b433674d8fe2c85&chksmfa826787cdf5ee91d01b6981ebd89deac3e350d747d0fec45ce2ef75d7cb8009341c6f55114d&token90645021…

智能驾驶系列报告:特斯拉智能驾驶方案简剖

不同于绝大多数国内车企在自动驾驶上采取多传感器融合方案&#xff0c;特斯拉FSD在发展初期就摒弃激光雷达、且不配备高清地图&#xff0c;成为在感知层以摄像头为核心的纯视觉解决方案代表;其依靠车身搭载的摄像头来捕捉周围的环境信息&#xff0c;并经过算法及神经网络模型处…