ARM体系结构学习笔记:寄存器

news2024/11/23 15:25:42

前段时间通篇概览一遍汇编语言程序设计——基于ARM体系结构(第4版), 总感觉纸上得来终觉浅, 并不能够让我产生一种读汇编就跟读C代码一样那种流畅的感觉. 如果我们越熟悉, 越发觉得他们是有规律可循的, 这里做一下对应的记录, 互相共勉.

通用寄存器并不通用

表面上arm为我们提供了31个通用寄存器, 但其实他们并不通用, 或者说编译在编译代码时, 并不是随意的给寄存器赋值的, 他们都被划分为了不同的用途和含义, 我们需要记住这些用途,看汇编看起来就不会无从着手了.

ARM64提供了31个通用寄存器,其用途如下表:

x0~x7:传递子程序的参数和返回值,使用时不需要保存,多余的参数用堆栈传递,64位的返回结果保存在x0中。

x8:用于保存子程序的返回地址,使用时不需要保存。

x9~x15:临时寄存器,也叫可变寄存器,子程序使用时不需要保存。

x16~x17:子程序内部调用寄存器(IPx),使用时不需要保存,尽量不要使用。

x18:平台寄存器,它的使用与平台相关,尽量不要使用。

x19~x28:临时寄存器,子程序使用时必须保存。

x29:帧指针寄存器(FP),用于连接栈帧,使用时必须保存。

x30:链接寄存器(LR),用于保存子程序的返回地址。

x31:堆栈指针寄存器(SP),用于指向每个函数的栈顶。

20211122173258

比较重要的寄存器 FP, LR, SP, PC, PSR

  1. 通过PC寄存器状态信息可以了解到目前PC寄存器在等待SVC调用, 处于read函数+4的偏移位置

  2. 通过LR寄存器了解到上一层调用来自__sread, 调用链为__sread()->read()

  3. PSR寄存器有好几种模式, 目前显示的是用户模式下面的CPSR寄存器的状态信息, 不同的位,具有不同的含义, 图片内已经做了详细的注释信息

次重要寄存器

hello:00000056C73836C4 SUB             SP, SP, #0x10           ; CODE XREF: main:loc_56C7383710↓p
hello:00000056C73836C8 MOV             W8, #1                  ; w8 = 1         ;
hello:00000056C73836CC MOV             W9, #2                  ; w9 = 2         ;
hello:00000056C73836D0 STR             W8, [SP,#0x10+var_4]    ; var_4 = w8 = 1 ;临时变量初始化为1
hello:00000056C73836D4 STR             W9, [SP,#0x10+var_8]    ; var_8 = w9 = 2 ;临时变量初始化2
hello:00000056C73836D8 STR             WZR, [SP,#0x10+var_C]   ; var_c = 0      ;临时变量初始化0     使用wzr寄存器
hello:00000056C73836DC LDR             W8, [SP,#0x10+var_4]    ; w8 = var_4 = 1 ;临时变量到寄存器w8
hello:00000056C73836E0 LDR             W9, [SP,#0x10+var_8]    ; w9 = var_8 = 2 ;临时变量到寄存器w9
hello:00000056C73836E4 ADD             W8, W8, W9              ; w8 = w8 + w9 = 3;执行加法
hello:00000056C73836E8 STR             W8, [SP,#0x10+var_C]    ; var_c = w8 = 3  ;存储结果
hello:00000056C73836EC LDR             W0, [SP,#0x10+var_C]    ; w0 = var_c = 3  ;返回结果 因为返回值是int, 因此使用w. w0便存储了对应的返回值
hello:00000056C73836F0 ADD             SP, SP, #0x10           ; ;pop stack      ;回收临时变量
hello:00000056C73836F4 RET
  1. X0寄存器: 保存返回值

  2. X8, X9寄存器: tmp

  3. WZR/XZR寄存器: zero寄存器, 一般用来进行零时变量初始化

PC寄存器

因为PC寄存器比较重要, 因此单独列出来

https://github.com/yhnu/note/tree/master/arm/02register_pc.md

指令的设计

  1. 没有隐式内存操作指令

所有的内存操作都有对应的指令(LDR/STR)

  1. 不同的指令都有对应的操作数{内存/立即数/寄存器}(对应数量1-3个)

(1) 内存操作数和立即数操作数不能同时存在

(2) 内存操作数至多出现一次

(3) 寄存器操作数总在最前面

常用的指令

  1. SUB

将某一寄存器的值和另一寄存器的值 相减 并将结果保存在另一寄存器中

SUB             x0, x1, x2   ; x0 = x1 - x2
SUB             SP, SP, #0x30; 更新栈顶寄存器的值,(可以看出:申请 0x30 字节占空间为临时变量)
  1. STP(stp:store pair)

入栈指令(str 的变种指令,可以同时操作两个寄存器), var_xxx(xxx代表偏移,一般为负数)

STP             X29, X30, [SP,#0x20+var_s0] ; 入栈指令(str 的变种指令,可以同时操作两个寄存器), 保存X29, X30, X29为FP寄存器, X30为LR寄存器
  1. ADD

将某一寄存器的值和另一寄存器的值 相加 并将结果保存在另一寄存器中

add x0, x0, #1    ; x0 = x0 + 1
add x0, x1, x2    ; x0 = x1 + x2
add x0, x1, [x2]  ; x0 = x1 + mem(x2)

ADD             X29, SP, #0x20; X29 = SP + 0x20, 前面已经保存了寄存器,这里开始使用寄存器
  1. ADR

    这是一条小范围的地址读取指令,它将基于PC的相对偏移的地址读到目标寄存器中;
    使用格式:ADR register exper

  2. ADRP

用来定位数据段中的数据用, 因为 aslr 会导致代码及数据的地址随机化, 用 adrp 来根据 pc 做辅助定位

ADRP            X8, #aGoing@PAGE        ; "going ...... \n"
ADD             X8, X8, #aGoing@PAGEOFF ; "going ...... \n"
  • 得到一个大小为4KB的页的基址,而且在该页中有全局变量aGoing的地址;ADRP就是讲该页的基址存到寄存器X8中;
  • ADD指令会算出g的地址,X8+#aGoing@PAGEOFF,#aGoing@PAGEOFF是一个偏移量;这样就得到了g的地址X8;

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-k4OGxdX9-1692235287484)(https://cdn.jsdelivr.net/gh/yhnu/PicBed/20211122213837.png)]

对应原理:

  • 编译时,首先会计算出当前PC到exper的偏移量#offset_to_exper
  • pc的低12位清零,然后加上偏移量,给register, 得到的地址,是含有label的4KB对齐内存区域的base地址;
  1. STUR/STR

ST开头的为存数据,比如说STR、STP、STUR

U: 表示负数
P: PAIR

STUR            WZR, [X29,#var_4]       ; var_4 = 0
STUR            W0, [X29,#var_8]        ; var_8 = w0; w0 is argc
STR             X1, [SP,#0x20+var_10]   ; var_10 = x1; x1 is argv
STR             X8, [SP,#0x20+var_18]   ; var_18 = x8;
  1. LDR
LDR             X0, [SP,#0x20+var_18]   ; x0 = var_18 = x8 = "going" is printf arg0
  1. BL/B/BR

BL: Branch with Link (−16MB to +16MB)

B : Branch (−2KB to +2KB)

BR: Branch to register (Any value in register)

B指令ARM官方文档

BL              unk_639712B640          ; jump to printf with save lr
BL              unk_639712B650          ; jump to getchar with save lr
B               loc_639712B738          ; while(1)
BR              X17                     ; printf

hello 添加对应注释

20211122190626

PLT 调用特征

loc_639712B640                            ; CODE XREF: main+28↓p
ADRP            X16, #off_639713BFB0@PAGE ; X16 = PAGE(0x110000)
LDR             X17, [X16,#off_639713BFB0@PAGEOFF] ;  X17 = mem(X16 + offset) ; offset=00112000
ADD             X16, X16, #off_639713BFB0@PAGEOFF  ; X16 = X16 + offset
BR              X17                                ; printf

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-62nOvZyQ-1692235287485)(https://cdn.jsdelivr.net/gh/yhnu/PicBed/20211122193628.png)]

通过printf的plt调用过程,他们使用的策略都是一样的:

  • 使用x16, x17寄存器
  • 首先使用ADRP找到页基址, 然后加载对应页偏移, BR进行寄存器跳转

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

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

相关文章

git版本管理加合并笔记

1.创建空文件夹,右键Bash here打开 2.打开链接,点击克隆下载,复制SSH链接 3.输入git SSH链接 回车 遇到问题: 但明明我已经有权限了, 还是蹦出个这 4.换成https在桌面上进行克隆仓库就正常了 5.去vscode里改东西 …

暑期关爱儿童安全“守护儿童远离烧烫伤 我是小小宣导员”活动走进德安社区

夏季是烧烫伤的高发季节,随着气温的升高,衣物的减少,皮肤外漏多,儿童自我保护能力弱,更容易受到烧烫伤害。为了守护儿童安全,8月11日下午,由中国社会福利基金会烧烫伤关爱公益基金主办&#xff…

VET:基因变异VCF数据集便捷提取工具

VET:Vcf Export Tools 工具简介 VET是一个基于R语言开发的变异位点信息批量提取工具,主要功能是根据VCF数据集,按照基因ID、样品ID、变异位点ID等参数,实现批量提取,同时支持变异位点结构注释,一步搞定变异…

慎投!新增4本期刊被“On Hold”!快自查

又新增了被标记的期刊!截至目前,小编从科睿唯安旗下的“Master Journal List”官网查到,本次新增4本ESCI期刊被标记,目前有8本SCIE期刊,1本SSCI期刊,13本ESCI期刊,共22本期刊被标记为“On Hold”…

应用案例 | 基于高精度三维机器视觉的车门框定位涂胶系统应用

Part.1 项目背景 传统的涂胶方式容易受到人工操作的限制,存在涂胶位置不准确、涂胶厚度不均匀等问题。随着汽车制造对涂胶质量和生产效率的要求越来越高,汽车制造商对于车门框定位涂胶的精度要求也越来越高,基于高精度三维机器视觉技术的车门…

用AI做表情包制作方法教程

今天要给大家分享的是用Midjourney制作微信表情包变现项目;在6月份给大家做过一期表情包的案例拆解,那期只作了案例分享和一些教程,这次我们得获得了最新的实战收益数据,下面是收益数据! 以前在没有AI工具的情况下&…

SpringBoot复习:(53)TransactionInterceptor是在哪里配置的?

我们知道SpringBoot的事务(Transactional)最终是通过TransactionInterceptor的invoke方法调用invokeWithinTransaction方法来开启事务控制的。 TransactionInterceptor bean在哪里配置的呢?在ProxyTransactionManagementConfiguration: 可以看到这里创建了一个Tra…

《人力资源》期刊简介及投稿要求

《人力资源》期刊简介及投稿要求 《人力资源》杂志创刊于1989年,是经新闻出版总署批准的一级期刊,是目前国内人力资源领域的实操性杂志。创刊30年来,作为人力资源领域的唯一官媒,我们始终坚持将全面推进“人才强国战略”为己任&a…

ElasticSearch-安装部署全过程

本文已收录于专栏 《中间件合集》 目录 概念说明什么是ElasticSearch什么是Kibana什么是RESTful API 提供服务安装过程安装ElasticSearch1.下载ElasticSearch 安装包2.解压安装包3.进入解压之后的文件夹4.创建一个data文件夹用来存储数据5.进入config文件夹编辑elasticsearch.y…

前端编辑页面修改后和原始数据比较差异

在软件研发过程中,会遇到很多编辑页面,有时编辑页面和新增页面长的基本上一样,甚至就是一套页面供新增和编辑共用。编辑页面的场景比较多,例如: 场景一、字段比较多,但实际只修改了几个字段,如…

LED电子显示屏在安防监控中心的作用

在安防监控中心,调度中心被视为核心要素,而LED电子显示屏则成为完整调度系统中人机互动的中心环节,涵盖人员调度、计划制定等关键决策,其地位举足轻重,主导全局。LED电子显示屏展示系统主要用途包括信息交流、人机互动…

使用GPT 自动化您的代码库

推荐:使用 NSDT场景编辑器 助你快速搭建可二次编辑的3D应用场景 介绍 随着人工智能领域的发展和演变,我们已经看到了GPT,ChatGPT,Bard等强大工具的兴起。程序员正在使用这些工具来简化他们的工作流程并优化他们的代码库。它使他们…

RWKV系列2-RWKV-LM

训练数据集 https://data.deepai.org/enwik8.zip 使用分类参考 https://zhuanlan.zhihu.com/p/639629050 模型分类和使用任务 解码参数,推荐值: 小说和对话:temp 1.2 topp 0.5 或 temp 1.4 topp 0.4 或 temp 1.7 topp 0.3 或 temp 2 top…

Openlayers实战:移动鼠标至重叠几何图形上,获取多层所有features信息

在Openlayers的实际项目中,经常会出现在某个区域内有多个矢量层叠加的情况,这个时候点击内部一点,我们要获取到所有矢量层的信息。如果做到这一点呢,这个示例就演示了两个图层叠加,获取到全部信息的情形。 效果图 源代码 /* * @Author: 大剑师兰特(xiaozhuanlan),还是…

Leetcode61 旋转链表

给你一个链表的头节点 head ,旋转链表,将链表每个节点向右移动 k 个位置。 示例1: 输入:head [1,2,3,4,5], k 2 输出:[4,5,1,2,3] 示例2: 输入:head [0,1,2], k 4 输出:[2,0,1] …

材料行业可以转IC设计后端吗?

近来有许多材料行业的小伙伴通过后台来问我对于职业规划的看法,甚至有些小伙伴直接点明了某个行业适不适合自己,那么我这边仅以近年来比较热门的数字芯片设计来展开讲讲,材料适不适合转行做IC呢。 对于理工科的同学而言,选择哪个…

网络安全设备篇——加密机

加密机是一种专门用于数据加密和解密的网络安全设备。它通过使用密码学算法对数据进行加密,从而保护数据的机密性和完整性。加密机通常被用于保护敏感数据,如金融信息、个人身份信息等。 加密机的主要功能包括: 数据加密:加密机使…

药品最新研究信息查询系统

查找最新药物研究进展信息在患者治疗选择、医疗实践、科学研究、药物监管和政策制定、教育和学术研究等方面都具有重要的应用价值。它可以为各个领域的人员提供最新的科学依据和决策支持,促进医学领域的发展和提高医疗质量。 但在查找药物最新研究进展信息时通常需要…

【数据库服务网格】浅谈Database Mesh及未来

文章目录 前言1. 服务网格:Service Mesh服务网格优势 2. 数据库服务网格:Database Mesh3. 数据服务网格:Data Mesh 前言 Database Mesh,这一概念是由开源软件shardingsphere的作者张亮,最早于2018年提出的。其含义是D…

又双叒叕!五大数据库全方位注释,抗性宏基因组分析项目再次升级!

基于宏基因组测序的抗性基因分析是目前ARGs分析的重要手段,五大数据库全面注释分析,一网打尽ARGs、MRGs、BRGs、MGEs、致病菌注释。 项目报告不仅包含抗性基因的多样性、丰度和分布模式,还能获得包括抗性组变化驱动因素、指示基因识别、抗性组…