ARM 汇编语言基础

目录

汇编指令代码框架

汇编指令语法格式

数据处理指令

数据搬移指令 mov

示例

立即数的本质

立即数的特点

立即数的使用

算术运算指令

指令格式

add 普通的加法指令

adc 带进位的加法指令

跳转指令

Load/Store指令

状态寄存器指令


基础概念

  1. C 语言与汇编指令的关系

    • 语句:带有分号 (;) 的 C 语言语句可以被编译成汇编指令。
    • 预处理指令:以井号 (#) 开头的行称为预处理指令,它们告诉编译器如何处理源代码。
  2. 汇编语言的整体分类

    • 指令:编译后生成一条机器码,存储在内存中供 CPU 执行。
    • 伪操作:不生成机器码也不占用内存,用于控制汇编过程。

      (相当于c中的’#‘的内容)告诉编译器怎么编译)

    • 伪指令:在编译时被替换为一系列等效的指令,用于实现某些高级功能。

      (如:cpu中没有乘法器,对应没有乘法指令,3*3 ---》用加法器实现3+3+3,替换实现)

  3. 注释

    • 单行注释:使用 @ 符号开始。
    • 多行注释:使用 /**/ 包围。
  4. 指令分类

    • 数据处理指令:对数据进行逻辑和算术运算。
    • 跳转指令:改变程序流程,即修改程序计数器 PC。
    • Load/Store 指令:读取和写入内存。
    • 状态寄存器传送指令:读写 CPSR(当前程序状态寄存器)。
    • 异常中断产生指令:触发软件中断(SWI),用于系统调用。
    • 协处理器指令:操作协处理器,比如浮点运算单元 FPU。

汇编指令代码框架

.text
.global _start
_start:; 汇编代码段
.end

汇编指令语法格式

<opcode><code>{s} Rd, Rn, operand2
  • opcode:指令名称。
  • code:条件码,可选,默认无条件执行。
  • s:是否更新 CPSR 的标志位。
  • Rd:目标寄存器。
  • Rn:第一个操作寄存器。
  • operand2:第二个操作数,可以是寄存器或立即数。
  • 注:指令的名字,条件码,s连到一起写,指令名和目标寄存器之间使用空格,寄存器和数据之间使用逗号隔开,指令中的字符不区分大小写

数据处理指令

数据搬移指令 mov

  • 格式<opcode><code>{s} Rd, operand2
  • 立即数形式mov{<code>}{s} Rd, #immediate
示例

在这个示例中,我们首先声明了一个 .text 段,然后定义了一个全局符号 _start,这是程序的入口点。接下来我们初始化寄存器 R00x1234,然后将 R0 的值复制给 R1。最后,通过 bx lr 返回到调用者

.text
.global _start_start:; 初始化寄存器 R0 为 0x1234mov r0, #0x1234; 将 R0 的值移动到 R1mov r1, r0; 结束程序bx lr.end
  • 1》数据搬移指令 mov
  • @ 格式:<opcode><code>{s} Rd, oprand2
  • 如果是立即数,前边必须加#

PC寄存器详细讲解:

指令的执行三步:取,译码,执行(PC永远指向当前正在取指指令的地址)。

立即数在 ARM 汇编语言中是一个重要的概念。立即数是直接编码在指令中的数值,它与普通变量不同,后者通常存储在内存中。下面是关于立即数的一些详细说明和优化后的格式:

立即数的本质

立即数是直接嵌入在指令中的数据,作为指令的一部分。这意味着当指令被加载到处理器中时,立即数也会同时被加载。

立即数的特点

  • 优点
    • 快速访问:因为立即数是与指令一同加载的,所以不需要额外的时间去内存中获取。
    • 节省空间:如果立即数足够小,那么可以减少对寄存器的需求,从而节省空间。
  • 缺点
    • 数量有限:立即数的大小受到指令格式的限制,ARM 架构中立即数通常被限制在一定范围内。
    • 表达能力受限:由于立即数大小的限制,有时候无法直接表示较大的数值。

立即数的使用

在 ARM 汇编语言中,立即数通常用于简单的数值操作,例如赋值或者与寄存器进行逻辑运算。立即数只能是某些特定的值,并且这些值通常被限制为可以由指令直接处理的形式。

如:MOV ,#0x12345678 @报错,不合法

对于 mov 指令而言,立即数必须是一个可以通过位移得到的 8 位值。这意味着立即数必须是 2 的幂次方的倍数,并且最大不超过 255。例如, 0x1234 是一个有效的立即数,因为它可以通过位移得到。但是 0x12345678 则不是一个有效的立即数,因为它超过了 8 位的限制,并且不能通过简单的位移得到。

注:使用mov 给寄存器里面存放值的时候,#号后面需是有效数(1:立即数,2:取反之后是立即数),如果不是立即数需要用ldr指令进行存放。

算术运算指令

常见的算术运算指令包括:

  • add:加法
  • adc:带进位的加法
  • sub:减法
  • sbc:带借位的减法
  • mul:乘法

指令格式

算术运算指令的一般格式如下:

<opcode>{<code>}{s} Rd, Rn, operand2

其中:

  • <opcode> 是指令名称。
  • <code> 是条件码,可选。
  • {s} 表示是否更新 CPSR 的标志位。
  • Rd 是目标寄存器。
  • Rn 是第一个操作寄存器。
  • operand2 是第二个操作数,可以是寄存器或立即数。
add 普通的加法指令

adc 带进位的加法指令

假设2个64位的数相加

  • 第一个64位的数,R0存放低32位,R1存放高32位,
  • 第二个64位的数,R2存放低32位,R3存放高32位
  • 结果R4存放低32位,R5存放高32位

add和ADC的区别,例如是64位的字符,如果低位大小满足进1的话用ADD只会显示在C进1,但是存储的地址并不进1,ADC的话则会将存储的地址进1

注意:mul r2, r0, #0x4 @ 错误

乘法指令的第二个操作数只能是一个寄存器

mul r2, r1,r0

跳转指令

1》修改PC,不建议使用,因为需要查询指令的地址

2》 b bl :指令跳转

  • 格式:b/bl Label
  • Label: 指令
  • 相当C语言的函数调用
  • B指令(不带返回的跳转)

不保存返回地址的跳转(返回地址不保存到lr中)

  • BL指令(带返回的跳转指令),将LR的值修改成跳转指令下一条指令的地址,再将PC的值修改成跳转标识符下指令的地址

补充了解:

RM指令条件码表:可跟的判断条件成立跳转(NZCV在用于判断两者之间关系使用比较多)

如:c代码如下:

练习:
    实现以下逻辑unsigned int r1 = 9;unsigned int r2 = 15;while(1){if(r1 == r2)goto stop;if(r1 > r2)
		            	r1 = r1 - r2;if(r1 < r2)
		         	r2 = r2 - r1;}
	stop:while(1);汇编指令练习答案如下:
    mov r1,#9
    mov r2,#15
loop:
      cmp r1,r2  @cmp 比较指令
      beq  stop
      subhi r1,r1,r2
      subcc r2,r2,r1
      b loop
stop:
    b stop

Load/Store指令

对内存的读写操作//如 a++ 读a的值,将运算结果从cpu写道内存

可用地址查找:(我们不用查找,脚本文件中配置了内存空间的分配) 查看内存中内容:

1>单寄存器操作指令 ldr/str

  1. 格式:ldr/str Rm, [Rn]
  2. Rm: 存储是数据

Rn:存储的数据,地址

将CPU中r1寄存器中的数据存储到内存中r0地址的空间中

  • 将r0指向的地址空间中的内容,读到r2寄存器中
  • ldr r2, [r0]

  • 将r1中的值存储到r0+4指向的地址空间中,R0中的值不变
  • str r1, [r0, #4];

  • 将r2中的值存储到r0指向的地址空间中,r0 = r0 + 4
  • str r2, [r0], #4

  • 将R3中的值存储到R0+4指向的地址空间中,并且r0 = r0 + 4
  • str r3, [r0, #4]!

  • 2>多寄存器操作指令 stm ldm
  • 将r1到r4中的值存储到r0指向地址空间中,连续16个字节的地址空间
  • stm r0, {r1-r4}

  • 将r0指向的地址空间中,连续的16个字节的数据,读到r5-r8寄存器中
  • ldm r0, {r5-r8}

  • 如果寄存器列表中的寄存器编号既有连续又有不连续,连续的使用“-”隔开,不连续的使用“,”
  • stm r0, {r1-r3,r4}

  • 2. 不管寄存器列表中的寄存器编号顺序如何变化,都是小地址对应小编号的寄存器高地址对应大编号的寄存器
  • stm r0, {r4,r3,r2,r1}
  • ldm r0, {r8,r7,r6,r5}

  • 3>栈的操作指令 stmfd ldmfd
  • 栈的种类
    • 空栈(Empty)

栈指针指向的地址是空的,在栈中存储数据时,可以直接存储,存储完成之后需要将栈指针再次指向空的位置。

  • 满栈(Full)

栈指针指向的地址有数据,在栈中存储数据时,需要先将栈指针,指向一个空的位置,然后在存储数据。

  • 增栈(Ascending)

栈指针向高地址方向移动

  • 减栈(Descending)

栈指针向低地址方向移动

操作栈的方式有四种

  • 满增栈 满减栈 空增栈 空减栈
  • FA:Full Ascending 满增(FA)
  • FD:Full Descending 满减(FD)
  • EA:Empty Ascending 空增(EA)
  • ED:空减
  • ARM默认采用的是满减栈

  • stmfd/ldmfd<code> sp!, {寄存器列表}
  • stmfd sp!, {r1-r5}(写) (压栈)

更新栈指针指向的地址空间

  • ldmfd sp!, {r6-r10}(读) (出栈)

特殊:

stmfd sp!, {r1-r5,lr}(写) (压栈)

ldmfd sp!, {r6-r10,pc}(读) (出栈) //r1-r5出栈给r6-r10, 将lr的值出栈给pc

状态寄存器指令

对CPSR进行读写操作//其他都不能动CPSR (SWI 指令是linux内核有,所以arm为了匹配才有的指令)(CPSR保存cpu的状态、模式、中断中断开关、运算状态,非常重要,不能任意更改,只有一类指令能操作这个寄存器)

1》读cpsr 指令mrs

2》写cpsr 指令 msr :一般情况不能修改cpsr,只能用msr命令修改,user模式下不能切换到其他模式。

注:修改CPSR的控制域(bit[7:0]),修改CPSR时必须指定修改哪个区域

USER模式下不能修改CPSR的值,防止应用程序修改CPU状态,保护操作系统

CPSR_C修改的是CPSR的低八位ctrl(控制)域,一般都只修改C域

OK,就分享到这,如果帮到你那就点个关注吧~

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

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

相关文章

Acrel-1000DP分布式光伏监控系统在光伏并网系统的实际应用分析-安科瑞 蒋静

摘要&#xff1a;为实现“双碳目标”即中国明确提出的2030年“碳达峰”与2060年“碳中和”目标。推动节能减排、实现经济可持续发展&#xff0c;我国采取了一系列方案和行动。其中就包括能源绿色低碳转型行动&#xff1a;大力发展新能源&#xff0c;‌推动煤电节能降碳&#xf…

让对话AI帮助你做程序架构设计,以及解决你的疑问

我想问下对话AI,本文采取的是chatgpt免费版 我问&#xff1a; 你说程序的设计&#xff0c;前后端分离的BS架构。比如工人基础档案1000条记录&#xff0c;工程项目基础档案10条记录&#xff0c;其他相关这两个基础档案的具体功能&#xff0c;比如打卡记录&#xff0c;宿舍记录&…

Java-super关键字

目录 1.super关键字 基本介绍 基本语法 案例演示 2.super使用细节 细节1 细节2 细节3 super和this的比较 1.super关键字 基本介绍 super代表父类的引用&#xff0c;用于访问父类的属性&#xff0c;方法&#xff0c;构造器。 基本语法 不能用super去访问父类的pri…

多模态大模型intern-vl 1.5 论文解读:How Far Are We to GPT-4V?

论文&#xff1a;https://arxiv.org/pdf/2404.16821 目录 1 介绍 3.1 整体架构 3.2 强大的视觉编码器 InternViT-6B-448px-V1.2 InternViT-6B-448px-V1.5 3.3 动态高分辨率 动态宽高比匹配 图像分割与缩略图 InternVL 1.5&#xff0c;这是一款开源的多模态大语言模型&…

SQL Zoo 9-.Window functions

以下数据均来自SQL Zoo 1.Show the lastName, party and votes for the constituency S14000024 in 2017.&#xff08;显示2017年选区“S14000024”的姓氏、政党和选票&#xff09; SELECT lastName, party, votesFROM geWHERE constituency S14000024 AND yr 2017 ORDER BY…

Spring Boot - 通过ServletRequestHandledEvent事件实现接口请求的性能监控

文章目录 概述1. ServletRequestHandledEvent事件2. 实现步骤3. 优缺点分析4. 测试与验证小结其他方案1. 自定义拦截器2. 性能监控平台3. 使用Spring Boot Actuator4. APM工具 概述 在Spring框架中&#xff0c;监控接口请求的性能可以通过ServletRequestHandledEvent事件实现。…

c语言11天笔记

函数的概述 函数&#xff1a;实现一定功能的&#xff0c;独立的代码模块。我们的函数一定是先定义&#xff0c;后使用。 使用函数的优势&#xff1a; 1. 我们可以通过函数提供功能给别人使用。当然我们也可以使用别人提供的函数&#xff0c;减少代码量。 2. 借助函数可以减…

基于单片机的智能风扇设计

摘 要: 传统风扇无法根据周围环境的温度变化进行风速的调整&#xff0c;必须人为地干预才能达到需求 。 本文基于单片机的智能风扇主要解决以往风扇存在的问题&#xff0c;其有两种工作模式: 手动操作模式和自动运行模式&#xff0c;人们可以根据需要进行模式选择。 在自动运行…

Leetcode每日刷题之面试题01.01.判断字符是否唯一

在学习编程语言的过程中相信大部分同学刚开始接触的循环语句都是 for 循环&#xff0c;今天我将介绍一个比较简洁的循环语句&#xff0c;可以帮助我们减少些许的代码量&#xff0c;也更加快捷&#xff0c;那就是范围 for 在我之前的博文中也有所介绍 详情点击&#xff1a;面向对…

五段式S型算法笔记

设定已知&#xff1a;v0 vmax j&#xff1b; 减加速段&#xff1a;tm到tmax 加加速段&#xff1a;0到tm tm&#xff1a;中点时间 vm&#xff1a;中点速度 vmax&#xff1a;最大速度&#xff1b; j加速度的斜率 -j相反加速度的斜率 这个图首先说明&#xff…

C 语言文件操作详解

目录 引言 一、基本概念 1.什么是文件 2.文件的属性 3.为什么使用文件 4.二进制文件和文本文件 二、文件的打开和关闭 1.流和标准流 2.文件指针 3.文件的打开和关闭 三、⽂件的顺序读写 1.顺序读写函数 2.详细介绍 1.fgetc 2.fputc 3.fgets 4.fputs 5.fscan…

OpenTiny HUICharts 正式开源发布,一个简单、易上手的图表组件库

引言 大家好&#xff01; 我们非常高兴地跟大家宣布&#xff0c;今天正式发布我们的新产品——OpenTiny HUICharts。这是一款前端 Web 可视化图表库&#xff0c;其基础图表功能构建于 ECharts 之上&#xff0c;而高阶图表则采用了新的底层技术&#xff0c;以满足更广泛的数据…

AI 手机的技术展望

某某领导问到我&#xff0c;AI手机这个产业发展如何&#xff1f;对于&#xff0c;地方科技园区&#xff0c;应该如何发展相关产业&#xff1f;我一时还真说不上来&#xff0c;于是&#xff0c;查了一下资料&#xff0c;大概应对了一下。 一&#xff1a;AI手机的定义 首先&…

python管理mysql

[rootserver1 ~]# pip3 config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple //这是设置清华镜像站&#xff0c;提高下载安装速度&#xff0c;如果报错提示找不到config&#xff0c;这是因为版本低&#xff0c;临时使用清华镜像站来升级 pip&…

Python PDF文本处理技巧 - 查找和高亮文字

目录 使用工具 Python在PDF中查找和高亮文字并统计出现次数和页码 Python在PDF的特定页面区域中查找和高亮文字 Python使用正则表达式在PDF中查找和高亮文字 Python在PDF中查找文字并获取它的坐标位置 其他查找条件设置 在日常工作和学习中&#xff0c;我们常常需要处理各…

SAP MM学习笔记 - 豆知识05 - Customer Exit 实例,MM01上定义Customer Exit 来Check评估Class

上一章讲了一些MM模块的豆知识。 - MM01中设定的安全在库和最小安全在库 - MM01/MMSC/Customize自动 扩张物料的保管场所 - MM01中定义生产订单的默认入库保管场所 - VA01受注票中设定禁止贩卖某个物料 SAP MM学习笔记 - 豆知识03 - 安全在库和最小安全在库&#xff0c;扩…

linux文件——深度学习文件fd、文件系统调用

前言&#xff1a;从本片开始正式进入linux文件的学习&#xff0c;本片内容主要是文件的fd。 本篇内容博主将要先带友友回忆C语言中的文件操作接口&#xff0c;然后再过渡到操作系统中的系统调用的学习&#xff0c;最后理解操作系统中的文件操作。 ps&#xff1a;本节内容设计一…

AI 深度学习让金融 β 系数估算更精确

作者:老余捞鱼 原创不易,转载请标明出处及原作者。 写在前面的话: 传统的金融贝塔系数估计方法往往依赖于严格的假设,难以准确捕捉 Beta 的动态变化,这限制了它们在实际应用中的有效性。为了解决这些问题,本文开发了一种新方法:NeuralBeta,利用神经网络进行Bet…

Centos7安装高版本内核

背景 买到的设备安装Centos7系统&#xff0c;但是新的处理器已经不支持低版本的Linux内核了。而且在 CentOS 使用过程中&#xff0c;高版本的应用环境可能需要更高版本的内核才能支持&#xff0c;所以难免需要升级内核。 内核种类 关于内核种类: kernel-ml&#xff1a;kerne…

趋动科技陈飞:从小模型到大模型,AI时代下的数据中心建设

自AI大模型横空出世&#xff0c;不断推动着AI从学术界到产业界向大众破圈&#xff0c;新的时代正在来临。11月15-16日&#xff0c;由CDCC主办的“2023第11届数据中心标准大会”在北京国家会议中心盛大开幕。 本届大会的主题围绕“AI时代 重塑未来”&#xff0c;聚焦数据中心领…