ARM64汇编02 - 寄存器与指令基本格式

最近的文章可能会有较多修改,请关注博客哦

异常级别

ARMv8处理器支持4种异常等级(Exception Level,EL)。

  • EL0 为非特权模式,用于运行应用程序,其他资源访问受限,权限不够。

  • EL1 为特权模式,用于操作系统内核,可以访问系统的所有资源

  • EL2 用于运行虚拟化管理管理程序(hypervisor)。

  • EL3 用于运行安全世界中的管理程序,安全模式(secure monitor)。

这里的异常概念不同于程序中的异常概念。当作中断理解会好点。

执行状态

ARMv8 架构定义了两种执行状态, AArch64和AArch32。当处于 AArch64 状态时,处理器执行 A64 指令集。当处于 AArch32 状态时,处理器可以执行 A32(在早期版本的架构中称为 ARM)或 T32 (Thumb) 指令集。所以,ARMv8的设备可以运行老程序,它是向前兼容的。

注意,AArch64 OS 运行 AArch32 程序时,当应用程序调用(SVC)指令,或接收中断,会切换到 EL1 和 AArch64。

寄存器

AArch64执行状态提供了32个在任何时间任何特权级下都可访问的64位的通用寄存器。

每个寄存器都有64位宽,它们通常被称为寄存器X0-X30。

每个AArch64 64位通用寄存器(X0-X30)也具有32位(W0-W30)形式。

也就是说,64位模式下寄存器名字叫 Xn,32位模式下名字叫 Wn。这些东西与 CSAPP 里面讲的都是差不多的,只不过它讲的是 X86 架构。

每个寄存器的用途如下:

在aarch64中,没有x31或w31寄存器,但是在一些指令或软件编码中,经常将数字31作为XZR或SP

  • X0-X7:用于参数传递

  • X9-X15:调用方需要保存这些寄存器的值,因为被调用函数可能会修改这些寄存器

  • X19-X29:被调用方保存这些寄存器的值,退出时再恢复,因为函数返回后可能调用方还会用到这些寄存器的值

  • X8, X16-X18, X29, X30:这些都是特殊用途的寄存器

特殊寄存器

  • X8: 用于储存间接结果的寄存器,比如返回一个结构体的时候,该寄存器储存的是结构体地址。

  • X18:不管

  • sp:保存栈顶地址

  • fp:保存栈底地址

  • lr:保存调用跳转指令 bl 指令的下一条指令的内存地址

  • zr:xzr/wzr分别代表 64/32 位,可用于清零的操作,零寄存器

  • pc: 保存将要执行的指令的地址

PSTATE

程序状态寄存器,程序中会存在很多分支,具体走哪条分支,是由状态寄存器决定的,比如一些比较指令执行时,需要根据状态寄存器的负数标志来决定是否进行逻辑分支跳转。

在aarch64中,只能可以通过MSR/MRS指令访问特殊寄存器(special-purpose)的方式读写这些位。除了这些特殊寄存器中表示的位,PSTATE的其它位都是不能访问的。

指令格式

ARM指令的基本格式如下:

<opcode> {<cond>} {S} <Rd>, <Rn>{,<operand2>}

其中<>号内的项是必须的,{}号内的项是可选的。各项的说明如下:

  • opcode:指令助记符

  • cond:执行条件

  • S:是否影响CPSR寄存器的值

  • Rd:目标寄存器

  • Rn:第一个操作数的寄存器

  • operand2:第2个操作数

ARM指令格式举例:

  • LDR R0, [R1]:读取R1地址上的存储单元内容,执行条件AL;

  • BEQ DATAEVEN:条件执行分支指令,执行条件EQ,即相等则跳转到DATAEVEN;

  • ADDS R2, R1, #1:加法指令,R2<-R1+1,影响CPSR寄存器;

  • SUBNES R2, R1,#0x20:条件执行的减法运算,执行条件NE,R1-0x20->R2,影响CPSR寄存器

AArch64没有直接与ARMv7中的CPSR等价的寄存器,但是可以访问PSTATE中对应的字段。

寻址方式

我觉的 csapp 在这方面讲的是真的好,一个表格就让初学者对汇编了解很多。看一个例子:

这个表格就说清楚了各种寻址方式对应的汇编格式。

我们看看 arm64 的寻址方式。

立即寻址

立即寻址也叫立即数寻址,这是一种特殊的寻址方式,操作数本身就在指令中给出,只要取出指令也就取到了操作数,这个操作数被称为立即数,对应的方式也称为立即寻址

ADD W0, W1, *#0x05*

寄存器寻址

寄存器寻址也就是利用寄存器中的数值作为操作数,这是一种常见的方式,也是效率比较高的寻址方式

ADD W0, W1, W2

寄存器间接寻址

寄存器间接寻址就是以寄存器中值作为操作数的地址,而操作数本身存放在存储器中

ADD W0, W1, [W2]
LDR W3, [W0]

基址变址寻址

基址变址寻址就是将寄存器(该寄存器一般称作基址寄存器)的内容与指令中给出的地址偏移量相加,从而得到一个操作数的有效地址。变址寻址方式常用于访问某基地址附近的地址单元, 常见的有以下几种形式:

LDR W0, [W1, #4]        ;将寄存器w1中内容加上4作为地址,然后将该地址处的数据存入寄存器w0中
LDR W0, [W1, #4]!       ;将寄存器w1中内容加上4作为地址,然后将该地址处的数据存入寄存器w0中,然后w1中的内容自增4
LDR W0, [W1], #4        ;将寄存器w1中的内容作为地址,然后将该地址处的数据存入w0中,并将w1中内容自增4
LDR W0, [W1, W2]        ;将w1和w2中的内容相加作为地址,然后将该地址处的数据存入w0

后缀

上面有个例子:

LDR W0, [W1, #4]!

汇编后面有个感叹号。ARM中的指令可以带后缀,从而丰富该指令的功能,常用的后缀有:

位数后缀

B(byte):功能不变,操作长度变为8位(依赖CPU位数,以下相同) 
H(Halfword):功能不变,操作长度变为16位

例如:ldr指令族:ldrb,ldrh,ldrsb ldrsh,从内存中加载指定长度的数据

S后缀

影响CPSR里的NZCV标识位。指令中使用”S“后缀时、指令执行后程序状态寄存器的条件标志位将被刷新。相当于有符号运算。

例如:

SUB    X1,X0,X3       ;X1=X0-X3  ,CPSR值不变
SUBS X1,X0,X3        ;X1=X0-X3 , 如果计算结果为负数,CPSR寄存器的N被置位

! 后缀

指令中地址表达式含有“!”后缀时,指令执行后,基址寄存器中的地址值将会发生变化。变化的结果是 (base+offset)。

例如:

LDR X3,[X0,#4]       //X3=X0+4
LDR X3,[X0,#4]!      //X3=X0+4; X0+=4;

注意:“!”不能用于寄存器PC后面

条件后缀

ARM架构中,允许在指令后面添加条件后缀来完成指令条件执行的目的。指令条件执行就是说,指令根据CPSR中条件码的状态和指令的条件域有条件的执行。当指令的执行条件满足时,指令被执行,否则指令将被忽略。

例如:

ADD X4,X2,#1                    ; 无条件执行 X4=X2+1
ADDEQ  X4,X2,#1             ;添加有条件执行后缀EQ,当CPSR中的Z标志置位(之前某条CMP结果相等)时,该指令才执行。注意:如果条件后缀和“S”标识同时出现,则S在条件后缀的后面,例如:
ADDEQS  X4,X2,#1          ;即为有条件执行X4=X2+1,结果更新条件标志位

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

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

相关文章

C++:常量表达式

C11开始constexpr作为一种声明&#xff0c;为编译器提供了在编译期间确认结果的优化建议&#xff0c;满足部分编译期特性的需求 constexpr和const区别 int b10; const int ab; //运行成功 constexpr int cb; //编译器报错&#xff0c;b的值在编译期间不能确定 const int size1…

电视盒子什么牌子好?老烧分享电视盒子品牌排行榜

多年前开始我就用电视盒子了至今已经七年&#xff0c;对各个品牌的电视盒子我都有详细深入的了解&#xff0c;看到网友们在讨论电视盒子什么牌子好&#xff0c;不知道如何挑选电视盒子的朋友们可以关注发烧友圈公认的电视盒子品牌排行榜&#xff0c;看看入围的都有哪些品牌吧。…

数据库之MVCC

1、什么是MVCC MVCC&#xff08;Multi-Version Concurrency Control&#xff09;即多版本并发控制。MVCC 是一种并发控制的方法&#xff0c;一般在数据库管理系统中&#xff0c;实现对数据库的并发访问。MVCC使得大部分支持行锁的事务引擎&#xff0c;不再单纯的使用行锁来进行…

如何让电脑待机而wifi不关的操作方法!!

1、一台电脑如果一天不关机&#xff0c;大约消耗0.3度电。 一般一台电脑的功耗约为250-400W&#xff08;台式机&#xff09;。 一台电脑每月的耗电量&#xff1a;如果是每小时300W每天10小时每月30天90KW&#xff0c;即90千瓦时的电。 这只是保守估计。 2、使用完毕后正常关闭…

小兴教你做平衡小车-stm32程序开发(串口打印)

文章目录 1 前言2 串口打印库函数版本3 串口打印寄存器版本3.1 配置时钟3.2 配置GPIO功能3.3 配置CR2寄存器3.4 配置CR1寄存器3.5 配置CR3寄存器 1 前言 我们在调试的过程中&#xff0c;都比较喜欢直观的数据&#xff0c;这时候我们可以使用芯片的串口功能&#xff0c;把数据打…

回归预测 | Matlab实现OOA-HKELM鱼鹰算法优化混合核极限学习机多变量回归预测

回归预测 | Matlab实现OOA-HKELM鱼鹰算法优化混合核极限学习机多变量回归预测 目录 回归预测 | Matlab实现OOA-HKELM鱼鹰算法优化混合核极限学习机多变量回归预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.Matlab实现OOA-HKELM鱼鹰算法优化混合核极限学习机多变量…

智慧生活,从餐厅开始:开发智能扫码点餐系统的技术详解

本篇文章&#xff0c;小编将深入为大家讲解开发智能扫码点餐系统的技术细节&#xff0c;从系统架构到关键功能实现&#xff0c;为读者提供全面的技术指南。 一、智能扫码点餐系统概述 可实现在线浏览菜单、点餐、支付等操作&#xff0c;大大简化了点餐流程&#xff0c;提升了…

Spring Cloud Gateway官方文档学习

文章目录 推荐写在前面一、熟悉Gateway基本概念与原理1、三大概念2、工作流程 二、基本使用路由断言的两种写法 三、路由断言工厂1、After路由断言工厂2、Before路由断言工厂3、Between路由断言工厂4、Cookie路由断言工厂5、Header路由断言工厂6、Host路由断言工厂7、Method路由…

大话设计模式——4.装饰模式(Decorator Pattern)

1.定义 1&#xff09;可以在不改动原有对象代码的情况下扩展对象的功能&#xff0c;通过聚合的方式相较于继承更加灵活。 2&#xff09;UML图 2.示例 汽车有很多装饰可选&#xff0c;如座椅、音响、轮胎等都可以进行自定义组装 1&#xff09;抽象汽车对象 public interfac…

代码库管理工具Git介绍

阅读本文同时请参阅-----免费的Git图形界面工具sourceTree介绍 Git是一个分布式版本控制系统&#xff0c;它可以帮助开发者跟踪和管理代码历史。Git的命令行工具是使用Git的核心方式&#xff0c;虽然它可能看起来有些复杂&#xff0c;但是一旦掌握了基本命令&#xff0c;你…

回归预测 | Matlab实现SSA-BiLSTM-Attention麻雀算法优化双向长短期记忆神经网络融合注意力机制多变量回归预测

回归预测 | Matlab实现SSA-BiLSTM-Attention麻雀算法优化双向长短期记忆神经网络融合注意力机制多变量回归预测 目录 回归预测 | Matlab实现SSA-BiLSTM-Attention麻雀算法优化双向长短期记忆神经网络融合注意力机制多变量回归预测预测效果基本描述程序设计参考资料 预测效果 基…

Pytorch添加自定义算子之(5)-配置GPU形式的简单add自定义算子

参考:https://zhuanlan.zhihu.com/p/358778742 一、头文件 命名为:add2.h void launch_add2(float *c,const float *a,const float *b,int n);

【Unity】构建简单实用的年份选择器(简单原理示范)

在许多应用程序和游戏中&#xff0c;年份选择是一个常见的需求。无论是在日历应用程序中查看事件&#xff0c;还是在历史类游戏中选择时间段&#xff0c;年份选择器都是用户体验的重要组成部分&#xff0c;下面实现一个简易的年份选择器。 一、效果预览&#xff1a; 目录 一、…

为什么会出现 targetId 与 senderUserId 相同的情况?

描述 单聊会话&#xff08;两位用户聊天&#xff09;中出现了消息的 targetId 和 senderUserId 相同的情况。 分析 融云 IM 设计如此。 senderUserId 是消息的发送者的用户 ID。targetId 是当前会话的 ID&#xff0c;该 ID 指向与本端用户对话的用户 ID、群组 ID、聊天室 I…

蓝桥杯_定时器的基本原理与应用

一 什么是定时器 定时器/计数器是一种能够对内部时钟信号或外部输入信号进行计数&#xff0c;当计数值达到设定要求时&#xff0c;向cpu提出中断处理请求&#xff0c;从而实现&#xff0c;定时或者计数功能的外设。 二 51单片机的定时/计数器 单片机外部晶振12MHZ&#xff0c;…

Linux系统Docker部署StackEdit Markdown并实现公网访问本地编辑器

文章目录 前言1. ubuntu安装VNC2. 设置vnc开机启动3. windows 安装VNC viewer连接工具4. 内网穿透4.1 安装cpolar【支持使用一键脚本命令安装】4.2 创建隧道映射4.3 测试公网远程访问 5. 配置固定TCP地址5.1 保留一个固定的公网TCP端口地址5.2 配置固定公网TCP端口地址5.3 测试…

基于Redo log Undo log的MySQL的崩溃恢复

基于Redo log & Undo log的MySQL的崩溃恢复 Redo log Undo log Redo log 重做日志,记录,修改过的数据 Undo log 回滚日志,记录修改之前的数据 两个我不做详细的介绍了,redo log就是记录哪些地方被修改了 undo log是记录修改之前我们的数据长什么样 更新流程 我们来捋一…

海量物理刚体 高性能物理引擎Unity Physics和Havok Physics的简单性能对比

之前的博客中我们为了绕过ECS架构&#xff0c;相当于单独用Batch Renderer Group实现了一个精简版的Entities Graphics&#xff0c;又使用Jobs版RVO2实现了10w人同屏避障移动。 万人同屏对抗割草 性能测试 PC 手机端 性能表现 弹幕游戏 海量单位同屏渲染 锁敌 避障 非ECS 那么有…

【C语言】while循环语句

&#x1f388;个人主页&#xff1a;豌豆射手^ &#x1f389;欢迎 &#x1f44d;点赞✍评论⭐收藏 &#x1f917;收录专栏&#xff1a;C语言 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共同学习、交流进步&…

c#使用log4net的3种调用方法

https://blog.csdn.net/summer_top/article/details/107961245 第一步&#xff1a;下载log4net。 右键项目引用&#xff0c;进入管理NuGet包。 搜索log4net&#xff0c;下载安装。 第二步&#xff1a;创建LogHelper类。 public class LogHelper { private LogHelp…