第七章 ARM 反汇编基础(七)(AArch64 汇编指令集)
文章目录
- AArch64 汇编指令集
- AArch64 指令编码
- AArch64 指令格式解析
AArch64 汇编指令集
- arm64-v8a 对应两套架构的指令集
- AArch32(简称“A32”)的 ARM、Thumb、Thumb-2 指令集
- AArch64(简称“A64”)的 64 位指令集
AArch64 指令编码
- AArch64 指令根据指令不同的位域分布将指令集分成了编码组(Encoding Group),在每个编码组下细分指令所属的类别:
28 | 27 | 26 | 25 | 24 | 编码组 |
---|---|---|---|---|---|
0 | 0 | - | - | - | 不可预料 |
1 | 0 | 0 | - | - | 数据处理(立即数)指令 |
1 | 0 | 1 | - | - | 分支、异常生成与系统指令 |
- | 1 | - | 0 | - | 加载与存储指令 |
- | 1 | 0 | 1 | - | 数据处理(寄存器)指令 |
0 | 1 | 1 | 1 | - | 数据处理 SIMD 与浮点指令 |
1 | 1 | 1 | 1 | - | 数据处理 SIMD 与浮点指令 |
- 可看出,只有
bits[28:24]
这五个位会影响指令的编码组,最后的 0b0111 与 0b1111 同属 SIMD 与浮点指令编码组 - AArch64 虽属 64 位指令系统,但指令长度仍为 32 位。AArch64 与 AArch32 最大的不同体现在寄存器的使用上。如,AArch32 中,将 R1 寄存器的值传入 R0 寄存器,对应的指令为
MOV R0, R1
;而在 AArch64 中,对应的指令有 32 位的MOV W0, W1
和 64 位的MOV X0, X1
。用 32 位还是 64 位的寄存器,主要根据指令最高位bit[31]
的 sf 域的值是否为 1 决定,若为 1,使用 64 位寄存器;否则使用 32 位寄存器。通常在具体指令的伪代码描述部分会有如下一行,用来说明寄存器使用位数的判断方法:
integer datasize = if sf == '1' then 64 else 32;
- 执行如下命令,可将 app2.c 编译成 AArch64 汇编代码:
AArch64 指令格式解析
- 以十六进制数 0x321D03E7 为例,分析其指令编码,找到其对应的 AArch64 汇编指令
- 用计算器查看其二进制编码:
bits[28:26]
的值为 0b100,对应数据处理(立即数)指令编码组- 数据处理(立即数)指令编码组中所有的指令类别:
28 | 27 | 26 | 25 | 24 | 23 | 指令类别 |
---|---|---|---|---|---|---|
1 | 0 | 0 | 0 | 0 | - | 相对于 PC 寄存器,取地址指令 |
1 | 0 | 0 | 0 | 1 | - | 加/减(立即数)指令 |
1 | 0 | 0 | 1 | 0 | 0 | 逻辑(立即数)指令 |
1 | 0 | 0 | 1 | 0 | 1 | 宽移动(立即数)指令 |
1 | 0 | 0 | 1 | 1 | 0 | 位域(Bitfield)指令 |
1 | 0 | 0 | 1 | 1 | 1 | 提取(Extract)指令 |
bits[28:23]
的值为 0b100100,对应逻辑(立即数)指令,其位域分布:
- 所有可选的指令:
sf | opc | N | 指令 | 寄存器位数 |
---|---|---|---|---|
0 | 00 | 0 | AND(立即数) | 32 位 |
0 | 01 | 0 | ORR(立即数) | 32 位 |
0 | 10 | 0 | EOR(立即数) | 32 位 |
0 | 11 | 0 | ANDS(立即数) | 32 位 |
1 | 00 | - | AND(立即数) | 64 位 |
1 | 01 | - | ORR(立即数) | 64 位 |
1 | 10 | - | EOR(立即数) | 64 位 |
1 | 11 | - | ANDS(立即数) | 64 位 |
bit[31]
的 sf 域值为 0,表示这是用 32 位寄存器的指令。bits[30:29]
的 opc 域值为 0b01,表示这是ORR
(立即数)指令- 使用 32 位寄存器的
ORR
指令格式:
ORR <Wd|WSP>, <Wn>, #<imm>
- 指令的位域分布:
ORR
指令的伪代码描述:
integer d = UInt(Rd);
integer n = UInt(Rn);
integer datasize = if sf == '1' then 64 else 32;
boolean setflags;
LogicalOp op;
case opc ofwhen '00' op = LogicalOp_AND; setflags = FALSE;when '01' op = LogicalOp_ORR; setflags = FALSE;when '10' op = LogicalOp_EOR; setflags = FLASE;when '11' op = LogicalOp_AND; setflags = TRUE;bits(datasize) imm;
if sf == '0' && N != '0'then ReservedValue();
(imm, -) = DecodeBitMasks(N, imms, immr, TRUE);
- 通过上述伪代码可计算出:d 的值为 Rd 域对应的整型数值,位于
bits[4:0]
,值为 0b00111,即数值 7,可知指令格式中的 Wd 为 W7;n 的值为 Rn 域对应的整型数值,位于bits[9:5]
,值为 0b11111,全为 1 表示 0 寄存器,即 Wn 对应 WZR 寄存器。接下来只要知道指令格式中的 imm 的计算方法,就能得到完整的指令
- 可通过 DecodeBitMasks() 计算出 imm,伪代码如下:
// DecodeBitMasks()
// ================// Decode AArch64 bitfield and logical immediate
// masks which use a similar encoding structure(bits(M), bits(M)) DecodeBitMasks(bit immN, bits(6) imms, bits(6) immr, boolean immediate)bits(M) tmask, wmask;bits(6) levels;// Compute log2 of element size// 2^len must be in range [2, M]len = HighestSetBit(immN:NOT(imms));if len < 1 then ReservedValue();assert M >= (1 << len);// Determine S, R and S - R parameterslevels = ZeroExtend(Ones(len), 6);// For logical immediate an all-ones value of S is reserved// since it would generate a useless all-ones result (many times)if immediate && (imms AND levels) == levelsthen ReservedValue();S = UInt(imms AND levels);R = UInt(immr AND levels);diff = S - R; // 6-bit subtract with borrowesize = 1 << len;d = UInt(diff<len-1:0>);welem = ZeroExtend(Ones(S + 1), esize);telem = ZeroExtend(Ones(d + 1), esize);wmask = Replicate(ROR(welem, R));tmask = Replicate(telem);return (wmask, tmask);
- 整个 imm 的计算过程较复杂,不展开推算,直接给出计算结果 8(PS:书上这么写的,故不知如何计算的,但是个人认为这不是重点)
- 综上,0x321D03E7 对应的 AArch64 汇编指令为
ORR W7, WZR, #8
- 可用 rasm2 命令验证(小端字节序):
- 若用 IDA Pro 分析这段指令,会发现 0x321D03E7 对应的指令为
MOV W7, #8
。关于这点,可在 ARM 指令参考手册看到如下描述:
Bitwise inclusive OR (immediate): Rd = Rn OR imm
This instruction is used by the alias MOV (bitmask immediate).
- 将 Rn 与 imm 按位或的结果传给 Rd,在本质上与执行
MOV Rd, Rn, #imm
一样,只是 IDA Pro 觉得用MOV
代替ORR
能让汇编代码更易读
第七章 ARM 反汇编基础(七)(AArch64 汇编指令集)相关推荐
- 第七章、 面向对象基础--下(续) 内部类、枚举、注解
文章目录 内容 学习目标 第七章 面向对象基础--下(续) 7.7 内部类 7.7.1 概述 7.7.1 非静态成员内部类 练习1:语法练习题 练习2:简单面试题 练习题3:高难面试题 7.7.2 静 ...
- 计算机组成原理白中英第七章,计算机组成原理第七章课件(白中英版).ppt
<计算机组成原理第七章课件(白中英版).ppt>由会员分享,可在线阅读,更多相关<计算机组成原理第七章课件(白中英版).ppt(32页珍藏版)>请在人人文库网上搜索. 1.计算 ...
- 数据结构题及c语言版严第七章答案,数据结构第七章习题答案.doc
数据结构第七章习题答案 PAGE PAGE 9 第7章 <图>习题参考答案 一.单选题(每题1分,共16分) ( C )1. 在一个图中,所有顶点的度数之和等于图的边数的 倍. A.1/2 ...
- 思科计算机第七章答案,CCNA第七章 访问控制列表 练习
原标题:CCNA第七章 访问控制列表 练习 访问控制列表 1 在哪一配置中,出站 ACL 位置优于入站 ACL 位置? A. 将 ACL 应用至出站接口以在数据包退出接口前筛选来自多入站接口的数据包时 ...
- Alientek I.MX6UL Linux- 第七章 ARM汇编基础
学习汇编的目的:初始化C语言运行环境. GNU汇编语法 label:instruction@comment label:标号,表示地址位置,有些指令前面可能会有标号 instruction:指令, ...
- 《实用机器学习》(孙亮 黄倩.著)笔记——第七章 推荐算法基础
一.推荐算法基础 两类基本对象:1.用户(user):2.商品(item) 除了用户-商品的交互信息外,其他可以利用的数据包括: (1)商品的信息,包括商品的价格.类型等: (2)用户的信息,如用户的 ...
- 第七章:CSS3基础---变形旋转 2d/3d、c3边框图片、变形缩放 2d/3d、变形倾斜2d、动画属性
<1..变形旋转 2d/3d> x轴旋转 transform:rotateX(数值deg) y轴旋转 transform:rotateY(数值deg) z轴旋转 transform:rot ...
- 卜若的代码笔记-一周搞定树莓派-第十七章:(QT基础七:定时器)
1 看一下教学任务里面给的范例 嗯,直接使用while循环,还是在窗口程序上使用while循环,这不得卡死窗口线程撒...窗口是有帧事件的嘛,你搞个while循环,窗口上的其他控件都没法介入,这不得太 ...
- JAVA程序设计第十版第七章_java程序设计第七章答案
参考答案如下 程序对于颅内压增高较重或急性病人的措施为 设计struct abc {int a,b,c;}; void main(){ struct abc s[2]={{1,2,3},{4,5,6} ...
最新文章
- 心系AI的百度,这次能翻身吗?
- rabbitmq 网络分区错误
- CoreData和SQLite多线程访问时的线程安全问题
- 实践2.4 ELF文件格式分析
- JSTL 核心标签库标签共有13个
- SQL Server中使用索引性能的比较
- Android 进阶 教你打造 Android 中的 IOC 框架 【ViewInject】 (上)
- linux桌面系统下的国密SM4算法工具
- 破解滑块验证码(打码平台)
- 使用 Flash 描述复杂的社交网络
- opencv图像灰化_Opencv——彩色图像灰度化的三种算法
- 2020年生肖码表图_2020年十二生肖号码表 查询属相年龄岁数对照图表
- opnelayers 基于ImageCanvas,简单云层图
- 英文版软件工程试题模拟试题
- seo优化与html,HTML SEO 优化技巧
- 苹果越狱后怎么还原_TestFlight/苹果TF上架到期后怎么办?
- JSD-2204-酷莎商城(后端)-Day17,18
- 技术不是越来越简单,而是框架是你的羁绊
- 基于PHP的视频社交管理系统
- import、from import及import as详解