ARM架构(汇编指令学习基础知识讲解)

news/2024/7/23 11:26:47 标签: arm开发, 架构, 汇编

文章目录

  • 前言
  • 一、RISC和CISC
  • 二、ARM中有哪些寄存器
    • 1.通用目的寄存器
    • 2.特殊寄存器
      • 一.栈指针(SP)
      • 二.链接寄存器(LR)
      • 三.程序计数器(PC)
  • 三、指令集讲解
  • 四、ARM汇编模拟器安装
  • 总结


前言

本篇文章我们来学习汇编指令,学习汇编对我们了解底层的逻辑是非常有帮助的,比如.s启动文件,学习了汇编后我们就可以读懂这个文件中的内容了。

一、RISC和CISC

RISC(Reduced Instruction Set Computer)和CISC(Complex Instruction Set Computer)是计算机体系结构的两种不同设计理念。

RISC(精简指令集计算机):
RISC体系结构的设计原则是通过减少指令集的复杂性和增加通用寄存器的数量来提高计算机的性能。关键特点包括:

1.简化指令集:RISC体系结构通常采用精简的指令集,每条指令的功能简单且执行时间均匀。这使得指令的执行速度更加可预测,并且更容易实现超标量(superscalar)和流水线(pipeline)技术。
2.大量通用寄存器:RISC体系结构提供大量通用寄存器,使得指令可以直接在寄存器之间进行操作,减少了访存操作次数,从而提高了性能。
3.简化的地址模式:RISC指令通常只支持简单的地址模式,如寄存器-寄存器(register-register)操作。复杂的地址计算通常由多条指令完成。
4.加载-使用延迟槽(Load-Use Delay Slot):RISC架构中常见的一种特性是在跳转指令之后设置一个延迟槽,延迟槽中的指令会在跳转指令执行前立即执行。这种设计可以利用延迟槽中的指令来隐藏跳转延迟,提高指令流水线的利用率。

RISC体系结构的设计使得指令的执行速度更快、处理器更易于实现并且更容易优化编译器的生成的代码。常见的RISC架构包括ARM和MIPS。

CISC(复杂指令集计算机):
CISC体系结构的设计思想是提供丰富而复杂的指令集,每条指令的功能更加强大和丰富。关键特点包括:

5.复杂指令集:CISC体系结构提供丰富的指令集,每条指令的功能包括多个低级操作。这样能够通过一条指令完成复杂的操作,减少了指令数目和程序长度。
6.多种地址模式:CISC指令通常支持多种复杂地址模式,允许在一条指令中完成复杂的内存访问。这样能够减少指令的数量和内存访问次数。
7.变长指令编码:CISC体系结构中的指令编码长度可以不同,根据指令的复杂程度和需要传递的参数调整指令长度。这样能够节省存储和带宽。
8.隐式操作数:CISC体系结构中的指令可以使用隐式操作数,减少了对寄存器和内存的显式引用。

CISC体系结构的设计提供了更高级别的操作和更方便的编程模型,但也导致了指令的执行速度不如RISC体系结构快,以及设计和实现的复杂性增加。常见的CISC架构包括x86。
无论是RISC还是CISC,它们都是用于构建计算机和处理器的不同的设计哲学,并且每种体系结构都有其优点和适用场景。实际应用中的选择通常取决于具体要求,例如性能、功耗、编程模型和可用的软件生态系统等。

二、ARM中有哪些寄存器

下图展示了ARM中Cortex-M3和Cortex-M4中的寄存器。
在这里插入图片描述

1.通用目的寄存器

通用目的寄存器是R0-R12,寄存器RO~R12为通用目的寄存器,前8个(RO~R7)也被称作低寄存器。由于指令中可用的空间有限,许多16位指令只能访问低寄存器。高寄存器(R8~R12)则可以用于32位指令和几个16位指令,如 MOV(move)。R0~R12的初始值是未定义的。

2.特殊寄存器

一.栈指针(SP)

R13为栈指针,可通过 PUSH和 POP操作实现栈存储的访问。物理上存在两个栈指针:主栈指针(MSP,有些ARM文献也称其为SP_main)为默认的栈指针,在复位后或处理器处于处理模式时,其会被处理器选择使用。另外一个栈指针名为进程栈指针(PSP,有些ARM文献也称其为SP_process),其只能用于线程模式。栈指针的选择由特殊寄存器CONTROL决定。对于一般的程序,这两个寄存器只会有一个可见。

MSP和 PSP都是32位的,不过栈指针(MSP或PSP)的最低两位总是为0,对这两位的写操作不起作用。对于ARM Cortex-M处理器,PUSH和POP总是32位的,栈操作的地址也必须对齐到32位的字边界上。

大多情况下,若应用不需要嵌入式OS,PSP也没必要使用。许多简单的应用可以完全依赖于MSP,一般在用到嵌人式OS时才会使用PSP,此时OS内核同应用任务的栈是相互独立的。PSP的初始值未定义,而MSP的初始值则需要在复位流程中从存储器的第一个字中取出。

二.链接寄存器(LR)

R14也被称作链接寄存器(LR),用于函数或子程序调用时返回地址的保存。在函数或子程序结束时,程序控制可以通过将LR的数值加载程序计数器(PC)中返回调用程序处并继续执行。当执行了函数或子程序调用后,LR的数值会自动更新。若某函数需要调用另外一个函数或子程序,则它需要首先将LR的数值保存在栈中,否则,当执行了函数调用后,LR的当前值会丢失。

在异常处理期间,LR也会被自动更新为特殊的EXC_RETURN(异常返回)数值,之后该数值会在异常处理结束时触发异常返回。本书第8章将会对这方面进行更加深人的介绍。

尽管Cortex-M处理器中的返回地址数值总是偶数(由于指令会对齐到半字地址上,因此,第0位为0),LR的第О位为可读可写的,有些跳转/调用操作需要将LR(或正使用的任何寄存器)的第0位置1以表示Thumb状态。

三.程序计数器(PC)

R15为程序计数器(PC),是可读可写的,读操作返回当前指令地址加4(由于设计的流水线特性及同ARM7TDMI处理器兼容的需要)。写PC(例如,使用数据传输/处理指令)会引起跳转操作。

由于指令必须要对齐到半字或字地址,PC的最低位(LSB)为0。不过,在使用
一些跳转/读存储器指令更新PC时,需要将新PC值的LSB置1以表示Thumb状态,否则就会由于试图使用不支持的ARM 指令(如ARM7TDMI中的32位ARM指令)而触发错误异常。对于高级编程语言(包括C和C++),编译器会自动将跳转目标的LSB置位。

多数情况下,跳转和调用由专门的指令实现,利用数据处理指令更新PC的情况较为少见。不过,在访问位于程序存储器中的字符数据时,PC的数值非常有用,因此,会经常发现存储器读操作将PC作为基地址寄存器,而地址偏移则由指令中的立即数生成。

三、指令集讲解

ARM和Thumb是ARM架构下的两种指令集。ARM指令集是32位的,而Thumb指令集是16位的,旨在提高代码密度和执行效率。

ARM指令集:
ARM指令集使用32位指令,每条指令都是32位长。它提供了丰富的指令集,包括数据处理指令、算术和逻辑操作指令、分支指令、加载/存储指令以及其他特殊指令。这些指令用于执行各种高级操作,例如执行算术运算、控制程序流、访问内存等。

ARM指令集的优势在于其灵活性和功能的全面性。由于指令长度较长,它能够更容易地进行复杂的操作和寻址模式,使得程序员可以编写功能丰富的代码。ARM指令集常用于高性能要求的应用领域,如嵌入式系统、移动设备和服务器等。

Thumb指令集:
Thumb指令集是ARM架构下的16位指令集,旨在提高代码密度和执行效率。Thumb指令集的指令长度较短,每条指令只有16位,因此可以节省存储空间并提高指令的缓存能力。这使得Thumb指令集在资源受限的系统中非常有用,如低功耗嵌入式系统和移动设备。

Thumb指令集提供了一系列精简的指令,包括数据处理指令、算术和逻辑操作指令、条件分支指令以及加载/存储指令等。尽管指令数量较少,但Thumb指令集通过使用寄存器的高位来增加额外的灵活性和寻址能力,以进行多种操作。

在Thumb指令集中,32位的ARM指令被压缩成16位的Thumb指令,从而提高了代码密度。但由于指令长度的限制,Thumb指令无法执行一些复杂的操作,例如大多数加载/存储多块数据和复杂的寻址模式。

需要注意的是,基于ARM架构的处理器通常可以同时支持ARM和Thumb指令集,这意味着可以在同一程序中混合使用两种指令集,根据需要选择合适的指令集编写代码。

总结起来,ARM和Thumb是ARM架构下的两种指令集。ARM指令集是32位的,提供了丰富的指令集功能,用于高性能的应用领域。Thumb指令集是16位的,旨在提高代码密度和执行效率,通常用于资源受限的系统。处理器通常可以同时支持ARM和Thumb指令集,提供了在同一程序中混合使用的灵活性。

四、ARM汇编模拟器安装

首先我们需要先安装一个ARM汇编模拟器,有了这个汇编模拟器后我们就可以在这个模拟器上来练习我们的汇编代码了。

安装步骤非常简单直接点击下一步运行即可。安装包我会放在微信公众中,回复18即可领取。

总结

本篇文章就讲解到这里,下一篇文章我们正式开始汇编指令的学习。


http://www.niftyadmin.cn/n/1756057.html

相关文章

使用Python开发ChatGPT AI工具助手(ChatCatsy):4天快速开发指南

引言: ChatGPT是一种基于人工智能的对话生成模型,它可以用于开发聊天机器人、虚拟助手等应用。本教程将指导您在3天内使用Python开发一个ChatGPT AI工具助手。无需担心,即使您是初学者,也可以轻松跟随本指南完成项目。 第一天&a…

vue获取当前坐标并通过天地图逆转码为省市区

因为需求需要获取用户当前的地理位置用于分析 通过原生的navigator.geolocation.getCurrentPosition获取经纬度 这个方法在谷歌浏览器会失效(原因未知),目前ie浏览器是可以获取的 getCurrentPosition() {if (navigator.geolocation) {var o…

c++ connect函数连接失败 解决方法

bool Connect() {//初始化网络WSADATA wsadata;WSAStartup(MAKEWORD(2, 2), &wsadata);if (0 ! WSAStartup(MAKEWORD(2, 2), &wsadata))return false;if (LOBYTE(wsadata.wVersion) ! 2 ||HIBYTE(wsadata.wVersion) ! 2) {printf("请求协议版本失败!\n");ret…

PostgreSQL常用配置参数【一表说明】

参数更改需要重新启动说明类型default范围设置建议Work_mem最小64kB.可以限制用于排序内存的大小,该值在客户端连接之后可以增加,该类型分配使用的是"非共享内存"整型4MB64~2147483647 单位KB通常设置为64MB。如果尝试寻找一个适合所有场景的答案,通常设置…

机器学习19:多类别神经网络-Multi-Class Neural Networks

在【机器学习12:分类 Classification】一文中,笔者介绍了二元分类模型,它可以在两个可能的选择之一之间进行选择,例如: 电子邮件是垃圾邮件还是非垃圾邮件。肿瘤是恶性的或良性的。 在本文中,我们将研究多类…

vue实现复制文本

方法一: 原理:浏览器本身提供了一个copy命令,利用它可以复制选中的内容:如果是输入框,我们可以利用select()方法来选中输入框中的内容,然后调用copy命令,将文本复制到剪切板,但是se…

AI怎么写诗

在开启人类和机器交互的大门一角的时切,AI(人工智能)技术以其惊人的进步速度,被广泛引用到各领域中,从自动驾驶汽车、人脸识别到在棋盘上挑战人类的世界冠军,AI已让我们意识到了它的巨大潜力。然而,人工智能是否能涉足…

使用QT: ActiveX控件生成文件,实现在QT项目中调用.c文件

以连接的其他控件为例,控件的位数(32/64),需要和QT编译器保持一致 我在此处连接的是.h和.c文件的类接口,在QT中使用 原始接口: 1.在QT程序中添加模块 QT axcontainer2.查看COM控件的UUID 打开一个.ui文件…