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.mzph.cn/news/718713.shtml

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

相关文章

【王道操作系统】ch1计算机系统概述-06虚拟机

文章目录 【王道操作系统】ch1计算机系统概述-06虚拟机01传统计算机02虚拟机的基本概念&#xff08;1&#xff09;第一类虚拟机管理程序&#xff08;2&#xff09; 第二类虚拟机管理程序&#xff08;3&#xff09; 两类虚拟机管理程序的对比 【王道操作系统】ch1计算机系统概述…

效果炸裂、刷爆各大视频网站的EMO到底是怎么做到的?

文章链接&#xff1a;https://arxiv.org/abs/2402.17485 今天分享的工作是刷爆各大视频平台的EMO的背后的工作原理。提出的初衷是着手解决增强发言者的头部特写视频生成中的现实感和表现力的挑战&#xff0c;重点关注音频提示与面部动作之间的动态和微妙关系。传统技术具有局限…

【HarmonyOS】鸿蒙开发之Stage模型-UIAbility的启动模式——第4.4章

UIAbi lity的启动模式简介 一共有四种:singleton,standard,specified,multion。在项目目录的:src/main/module.json5。默认开启模式为singleton(单例模式)。如下图 singleton&#xff08;单实例模式&#xff09;启动模式 每个UIAbility只存在唯一实例。任务列表中只会存在一…

测试管理进阶 | 量力而行:避免成为替罪羊

职场中,我们常常面临是否帮助他人的抉择。尽管善良是美德,但过度的好人卡可能会给自己带来麻烦。本文将探讨如何在职场中量力而行,避免成为替罪羊,以及如何保持高效和合理的职责划分。 我们在工作中常常会遇到一些需要帮助他人的情况,作为团队的一员,我们希望能够积极地协…

Linux运维_Bash脚本_编译安装libGD-2.3.3

Linux运维_Bash脚本_编译安装libGD-2.3.3 Bash (Bourne Again Shell) 是一个解释器&#xff0c;负责处理 Unix 系统命令行上的命令。它是由 Brian Fox 编写的免费软件&#xff0c;并于 1989 年发布的免费软件&#xff0c;作为 Sh (Bourne Shell) 的替代品。 您可以在 Linux 和…

六、继承(一)

1 继承的引入 以往我们想分别实现描述学生、老师的类&#xff0c;可能会这样子做&#xff1a; class Student {string _name;string _number;int _tel;int id;string _address;int _age; }; class Teacher {string _name;int _level;int _tel;int id;string _address;int _ag…

【归并排序】 详细解析 动图演示 逐图解析 洛谷P1177【模板】排序 sort【快速排序】

文章目录 归并排序1.归并排序的复杂度分析2.细节解释3.归并排序动图演示3(1) 我们的拆分过程如下↓ 4.code↓ 洛谷P1177【模板】排序数据规模与约定code&#xff08;归并排序&#xff09;↓code&#xff08;sort排序【快速排序】&#xff09; 完结撒花(&#xffe3;▽&#xff…

阅读笔记 | REFORMER: THE EFFICIENT TRANSFORMER

阅读论文&#xff1a; Kitaev, Nikita, Łukasz Kaiser, and Anselm Levskaya. “Reformer: The efficient transformer.” arXiv preprint arXiv:2001.04451 (2020). 背景与动机 这篇论文发表较早&#xff0c;主要关注Transformer的效率问题。标准的Transformer模型在许多自然…

数据中台:数字中国战略关键技术实施

这里写目录标题 前言为何要建设数据中台数据中台建设痛点数据中台学习资料聚焦前沿&#xff0c;方法论体系更新与时俱进&#xff0c;紧跟时代热点深入6大行业&#xff0c;提炼实践精华大咖推荐&#xff0c;数字化转型必备案头书 前言 在数字中国这一国家战略的牵引下&#xff0…

测试基础|质量保障体系从1到N的思考

在2023年,重点构建了团队的质量保障体系,基本完成了从0到1的过程积累,也在多个不同的场合做了相关的分享,收获了很多同行给的建议和意见。今年的首个工作目标是把这套质量保障体系运营好,去覆盖更多的团队,完成从1到N的过程,让更多的团队从这个质量体系中获益,保障基本…

Node插件开发(1)-快速入门

在使用Electron开发客户端时&#xff0c;如果现有Node模块所提供的功能无法满足需求&#xff0c;我们可以使用C开发自定义的Node模块&#xff0c;也称插件&#xff08;addon&#xff09;。 Node.js插件的扩展名为.node&#xff0c;是二进制文件&#xff0c;其本质上是动态链接…

基于springboot+vue的响应式企业员工绩效考评系统(源码+论文)

文章目录 前言 一、功能设计 1 普通员工功能 2 主管功能 3 系统管理员功能 4 评分标准功能 5 PC端与手机端 6 制图 二、功能实现 普通员工 1普通员工登录 2公告板块 3日志板块 主管 1主管登录 2公告板块 3日志板块 4绩效评分板块 5个人信息板块 系统管理员…

TypeScript 日期格式化工具方法

工具方法 创建工具文件&#xff1a;util.ts /*** 获取时间并格式化函数* param M 格式模板 如: YYYY-MM-DD ...* param Time 可选传入时间参数 默认为 Now*/ export const getFormatDate (M: string, Time: Date | null | string | number null) > {let date: Date Tim…

在 Linux 环境下安装 Kibana

目录 一、Kibana 是什么 二、在 Linux 环境下安装 Kibana 1、下载安装包 2、解压 3、修改 Kibana的配置文件 config/kibana.yml 4、启动 5、浏览器登录 Kibana 6、测试查询 一、Kibana 是什么 Kibana 是通向 Elastic 产品集的窗口。 它可以在 Elasticsearch 中对数据进…

品牌推广的两种飞轮:非酋飞轮与欧皇飞轮

在品牌推广的世界里&#xff0c;存在着两种截然不同的飞轮效应&#xff0c;我们称之为“非酋飞轮”与“欧皇飞轮”。这两种飞轮象征着品牌发展的两种不同路径和策略&#xff0c;而迅腾文化则以其独特的“繁”的原则&#xff0c;巧妙地将这两种飞轮结合&#xff0c;助力品牌形成…

Linux安装JumpServer并结合内网穿透实现公网访问本地服务

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

Kubernetes 学习总结(46)—— Pod 不停重启问题分析与解决

我们在做性能测试的时候&#xff0c;往往会发现我们的pod服务&#xff0c;频繁重启&#xff0c;通过kubectl get pods 命令&#xff0c;我们来逐步定位问题。 现象:running的pod&#xff0c;短时间内重启次数太多。 定位问题方法:查看pod日志 kubectl get event …

【Element】实现基于 Element UI el-tabs 的左右滑动动画

实现基于 Element UI el-tabs 的左右滑动动画 引言 在构建现代 web 应用时&#xff0c;为用户提供平滑的动画效果是提升用户体验的关键。本篇博客将详细介绍如何在使用 Vue 以及 Element UI 时&#xff0c;实现一个具有左右滑动效果的 tab 切换动画。 使用 el-tabs 创建 tab…

Flutter 中的 SliverGrid 和 GridView:区别与使用场景

在 Flutter 中&#xff0c;SliverGrid 和 GridView 都是用于展示网格布局的组件&#xff0c;但它们有着不同的特点和适用场景。本文将介绍它们之间的区别以及在实际开发中的使用场景。 SliverGrid 和 GridView 的区别 SliverGrid&#xff1a; SliverGrid 是 CustomScrollView …

第十五届蓝桥杯第三期模拟赛题单

目录 第一题&#xff1a; 第二题&#xff1a; 第三题&#xff1a; 第四题: 第五题&#xff1a; 第六题&#xff1a; 第七题 第八题 第九题 第十题 第一题 【问题描述】 请问 2023 有多少个约数&#xff1f;即有多少个正整数&#xff0c;使得 2023 是这个正整数的整数倍…