历史上的今天
返回首页

历史上的今天

今天是:2025年12月09日(星期二)

正在发生

2022年12月09日 | ARM汇编教程(2): 数据类型与寄存器

2022-12-09 来源:zhihu

数据类型

这是 ARM 汇编基础知识系列教程的第二部分,涉及数据类型和寄存器。

与高级语言类似,ARM支持对不同数据类型的操作。我们可以加载(或存储)的数据类型可以是有符号和无符号字、半字或字节。这些数据类型的扩展是。-h或-sh用于半字,-b或-sb用于字节,而字则没有扩展。有符号和无符号数据类型之间的区别是。

有符号的数据类型可以容纳正值和负值,因此范围较小。

无符号数据类型可以保存大的正值(包括 "零"),但不能保存负值,因此范围更广。

下面是一些例子,说明这些数据类型如何与指令Load和Store一起使用。

大小端

在内存中,有两种查看字节的基本方法。小端(LE)或大端(BE)。区别在于一个对象的每个字节在内存中的存储顺序。在像英特尔x86这样的小端机器上,最不重要的字节被存储在最低地址(最接近零的地址)。在big-endian机器上,最重要的字节被存储在最低地址。ARM架构在第3版之前是小-endian,从那时起,它是双-endian,这意味着它有一个允许可切换endianness的设置。例如,在ARMv6中,指令是固定的小字节,数据访问可以是小字节或大字节,由程序状态寄存器(CPSR)的第9位(E位)控制。

ARM寄存器

寄存器的数量取决于ARM的版本。根据ARM参考手册,除了基于ARMv6-M和ARMv7-M的处理器外,有30个通用的32位寄存器。前16个寄存器可在用户级模式下访问,其他寄存器可在特权软件执行中使用(ARMv6-M和ARMv7-M例外)。在本系列教程中,我们将处理在任何特权模式下都可以访问的寄存器:r0-15。这16个寄存器可以分成两组:通用寄存器和特殊用途寄存器。

下表展示了ARM寄存器与Intel处理器中的寄存器之间的关系。

R0-R12:在普通操作中可用于存储临时值、指针(存储器的位置)等。例如,R0在进行算术运算时可作为累加器,或用于存储先前调用的函数的结果。R7在处理系统调用时变得非常有用,因为它存储了系统调用的编号,R11帮助我们跟踪堆栈上的边界,作为框架指针(将在后面介绍)。此外,ARM的函数调用惯例规定,函数的前四个参数存储在寄存器r0-r3中。

R13:SP(堆栈指针)。堆栈指针指向堆栈的顶部。堆栈是一个用于特定函数存储的内存区域,在函数返回时被回收。因此,堆栈指针用于分配堆栈的空间,方法是用堆栈指针减去我们要分配的值(以字节为单位)。换句话说,如果我们想分配一个32位的值,我们从堆栈指针中减去4。

R14:LR(链接寄存器)。当一个函数被调用时,链接寄存器被更新为内存地址,引用函数启动的下一条指令。这样做允许程序在 "子 "函数完成后返回到启动 "子 "函数的 "父 "函数。

R15:PC(程序计数器)。程序计数器根据所执行的指令的大小自动递增。这个大小在ARM状态下总是4字节,在THUMB模式下是2字节。当一个分支指令被执行时,PC保存目标地址。在执行过程中,PC在ARM状态下存储当前指令的地址加8(两条ARM指令),在Thumb(v1)状态下存储当前指令加4(两条Thumb指令)。这与x86不同,x86的PC总是指向要执行的下一条指令。

让我们看看PC在调试器中是如何表现的。我们用下面的程序将PC的地址存入r0,并包括两条随机指令。让我们看看会发生什么。

在gdb中我们在_start处设定一个断点

如下是运行的结果:

我们可以看到,PC持有将被执行的下一条指令(mov r0, pc)的地址(0x8054)。现在让我们执行下一条指令,之后R0应该持有PC的地址(0x8054),对吗?

...对吗?错了。看看R0中的地址。当我们期望R0包含先前读取的PC值(0x8054)时,它却包含了比我们先前读取的PC值(0x805c)提前两条指令的值。从这个例子中你可以看到,当我们直接读取PC时,它遵循PC指向下一条指令的定义;但在调试时,PC指向当前PC值前面的两条指令(0x8054 + 8 = 0x805C)。这是因为较早的ARM处理器总是在当前执行的指令之前获取两条指令。ARM保留这一定义的原因是为了确保与早期处理器的兼容性。

当前程序状态寄存器

当你用gdb调试一个ARM二进制文件时,你会看到一个叫做Flags的东西。

寄存器$cpsr显示了当前程序状态寄存器(CPSR)的值,在它下面可以看到Flagsthumb, fast, interrupt, overflow, carry, zero, and negative。这些标志代表了CPSR寄存器中的某些位,并根据CPSR的值来设置,激活时变成粗体。N、Z、C和V位与x86上EFLAG寄存器中的SF、ZF、CF和OF位相同。这些位被用来支持汇编级的条件和循环的条件执行。我们将在第6部分 "条件执行和分支 "中介绍使用的条件代码。

上图显示了一个32位寄存器(CPSR)的布局,左边(<-)是最重要的位,右边(->)是最小的位。每一个单元(除了GE和M部分以及空白部分)都是一个比特的大小。这些一比特的部分定义了程序当前状态的各种属性。

让我们假设我们使用CMP指令来比较数字1和2。结果是 "负",因为1-2=-1。当我们比较两个相等的数字时,比如2对2,Z(零)标志被设置,因为2-2=0。请记住,CMP指令使用的寄存器不会被修改,只有CPSR会根据这些寄存器相互比较的结果被修改。

这是GDB中的情况(安装了GEF)。在这个例子中,我们比较寄存器r1和r0,其中r1=4,r0=2。这是执行了cmp r1, r0操作后的标志的情况。

进位标志被设置,因为我们用cmp r1, r0来比较4和2(4-2)。相反,如果我们使用cmp r0, r1来比较一个较小的数字(2)和一个较大的数字(4),则负标志(N)被设置。

下面是ARM信息中心的一段摘录:

APSR包含以下ALU状态标志。

N - 当操作的结果为负数时设置。

Z - 当操作的结果为零时设置。

C - 当操作的结果是Carry时设置。

V--当操作引起溢出时设置。

carry在以下情况被设置:

如果加法的结果大于或等于2^32

如果减法的结果是正数或零

作为移动或逻辑指令中的内联移位操作的结果。

如果加法、减法或比较的结果大于或等于2^31,或小于2^31,则发生溢出。

本文是ARM汇编系列教程的第2部分, 介绍arm的基本数据类型, 和基本寄存器相关知识


推荐阅读

史海拾趣

GradConn Ltd公司的发展小趣事

GradConn始终将技术创新作为公司发展的核心驱动力。公司拥有一支专业的研发团队,致力于开发新型连接器和电缆组件,以满足不断变化的市场需求。同时,GradConn的所有工厂均通过了ISO 9001:2015和ISO 14001:2015等国际质量管理体系认证,确保了产品的高质量和环境友好性。这些认证不仅提升了GradConn的品牌形象,还为其在全球市场上赢得了更多客户的信任和支持。

安森德(Ascend)公司的发展小趣事

在快速发展的过程中,安森德公司始终注重品牌建设和文化塑造。公司坚持以客户为中心的服务理念,不断提升产品质量和服务水平。同时,安森德还积极参与各类行业活动和公益事业,提升公司的社会形象和品牌价值。在内部管理方面,公司倡导创新、协作、担当的企业文化,为员工提供了一个良好的工作环境和发展平台。这些举措不仅增强了员工的归属感和凝聚力,也为公司的长远发展奠定了坚实的基础。

ConnectBlue公司的发展小趣事

尽管已经取得了显著的成就,但ConnectBlue公司并没有止步不前。相反,公司继续坚持创新驱动的发展战略,不断推出新产品、新技术和新服务。同时,公司还积极关注行业发展趋势和未来技术方向,为公司的长期发展做好充分准备。展望未来,ConnectBlue公司将继续致力于无线通信技术的研发和应用,为推动电子行业的进步和发展做出更大的贡献。

这五个故事展示了ConnectBlue公司在电子行业中的发展历程和取得的成就。从创立初期的艰难起步到产品创新的突破、市场拓展的成功、被u-blox收购后的新跨越以及持续创新的未来展望,ConnectBlue公司始终保持着积极进取的精神和不断创新的态度,在无线通信领域取得了显著的成绩。

ABCircuits公司的发展小趣事

ABCircuits公司成立之初,便专注于半导体技术的研发。在电子行业的浪潮中,公司敏锐地洞察到市场对高性能、低功耗芯片的需求,于是投入大量资源进行研发。经过数年的努力,ABCircuits成功推出了一款具有革命性的芯片,该芯片在性能上远超同行,同时功耗极低,迅速获得了市场的认可。这一技术创新为ABCircuits公司打开了新的市场领域,奠定了其在行业内的领先地位。

FUJIKURA公司的发展小趣事

在电子行业中,产品质量是企业的生命线。ABCircuits深知这一点,因此从成立之初就建立了严格的质量管理体系。公司注重从原材料采购到生产制造的每一个环节的质量控制,确保每一件产品都符合高标准的品质要求。这种对品质的坚持让ABCircuits赢得了客户的信赖和口碑,使其在市场中脱颖而出。

Cincon公司的发展小趣事

创新是Cincon持续发展的动力。2003年,公司在台北设立了研发中心,专注于电源产品的技术创新和研发。这一举措极大地提升了公司的技术实力和产品创新能力。几年后,Cincon成功设计并制造了LED电源,进一步丰富了产品线,并满足了市场对高效节能照明解决方案的需求。

问答坊 | AI 解惑

发现单片机和嵌入式的帖子最多。

这能说明什么问题呢? [ 本帖最后由 lzcqust 于 2009-5-11 18:16 编辑 ]…

查看全部问答>

信号滤波

有一信号,有三种状态,0v,5v,24v,请问怎么把24v滤掉呢。系统只能提供5v电源,不能提供24v电源。…

查看全部问答>

J-Link5VAdapter电路图

求一份J-Link 的5V 适配器电路图,JLINK只能支持到3.3V。谢谢了savage_sdj@126.com…

查看全部问答>

flash 烧写

本帖最后由 dontium 于 2015-1-23 13:25 编辑 dsp中的flash 烧写有没有大小限制?比如最好小于32k.我做了的93k的H文件,也成功烧写进去了!不过程序只运行了开头的部分,下面就没有了.不知为什么? …

查看全部问答>

粗谈MB9BF506N硬件

富士通DIY工业测控终端的原理图和PCB都搞定了,目前正在做制板前最后一次检查。因为前期工作主要偏重比较偏硬件,就先谈谈我对富士通FM3系列(MB9BF506N)硬件感觉吧。原理图和PCB稍后公布。 这款芯片给人的第一感觉就是粗犷(我当时都有发晕,复用功 ...…

查看全部问答>

电磁制动技术的发展现状及未来

伴随着汽车的更新换代,以及人们对汽车安全性、舒适性、经济性等性能的要求越来越高,保护汽车安全行驶的制动器装置,由最初的简单机械式制动器逐步发展到现在的ABS(Anti-lock Brake System)防抱制动系统。然而ABS仍然存在一些问题,譬如很难精确测 ...…

查看全部问答>

ADC与DAC专题学习

什么是 ADC? “ADC”Analog-to-Digital Converter 的缩写,指模/数转换器或者模拟/数字转换器。真实世界的模拟信号, 例如温度、压力、声音或者图像等,需要转换成更容易储存、处理和发射的数字形式。模/数转换器可以实 现这个功能。 什么是 DA ...…

查看全部问答>

为什么3D模型自己变大了?

就如图上那样,为什么我一开始放置3d模型的时候它的宽度大约是343mil;可是经过我在3D视图中模型与焊盘的相对位置调整后以便使他们对应,却发现模型自己变大了,返回二维视图后一测量,宽度就变成了400mil了。我并没有调整模型的大小,而且我也不会 ...…

查看全部问答>

小照度传感器 变送器

照度传感器GZD系统光照度变送器采用对弱光也有较高灵敏度的硅兰光伏探测器作为传感器;具有测量范围宽、线形度好、防水性能好、使用方便、便于安装、传输距离远等特点,适用于各种场所,尤其适用于农业大棚、城市照明等场所。根据不同的测量场所, ...…

查看全部问答>