首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >ARM / Aarchh64处理器等效eip/rip、ebp/rpb、UESP/rsp寄存器

ARM / Aarchh64处理器等效eip/rip、ebp/rpb、UESP/rsp寄存器
EN

Stack Overflow用户
提问于 2021-12-10 08:48:00
回答 2查看 569关注 0票数 1

标题##What相当于eiprip寄存器用于英特尔CPU,但用于ARM/Aaarch64CPU?

我需要翻译一个为英特尔CPU编写的应用程序,它使用32位eip或64位rip寄存器。

这些方法使用英特尔寄存器:

函数GetInstructionPointerRegisterValue -->用途: regs32eip或regs64rip。

函数GetStackBasePointerRegisterValue -->用途: regs32ebp或regs64rbp

函数GetStackPointerRegisterValue -->用途: regs32UESP或regs64rsp。

我应该为ARM/Aaarch64使用什么类似的寄存器?

它是否存在一个具有比较和等价的x86/ And 64寄存器与arm/aarch64寄存器的表?

谢谢。

EN

回答 2

Stack Overflow用户

发布于 2021-12-10 09:46:18

ARM/AArch64上的程序计数器称为PC。

ARM有一个有限范围的PC相对寻址模式.我认为AArch64也是这样,但是它也有adrp等等,用于将PC相对地址生成到另一个寄存器,比如x86-64RIP相对LEA。

ARM和AArch64没有许多/任何指令隐式地使用堆栈指针以外的任何特定通用寄存器,因此x86-64的“等效表”将非常短。例如,与x86 shl r/m, cl不同的是,您不需要在特定寄存器中使用它来进行转换,更像x86 BMI2 shlx reg, reg/mem, reg,但是没有使用内存源的CISC能力。ARM和AArch64从一个更正交的设计开始,而不是像x86那样对不同的寄存器进行大量的隐式使用,从而允许使用x86的可变长度指令编码来缩短指令。

票数 1
EN

Stack Overflow用户

发布于 2021-12-12 10:04:04

aarch64

AArch64等价于x86指令指针是程序计数器寄存器pc。与ARM32不同,pc不是一个通用寄存器,不能与mov这样的普通指令一起使用.但是,如果您需要它的“当前值”,即当前指令的地址(或下一个指令,无论您喜欢哪一个),您可以使用adr指令来完成这一任务,该指令返回pc的值加上一个立即偏移量。(这里的adrp只会给你带来高52位的信息。)我认为大多数汇编程序不会让您直接将偏移量指定为0,但您可以使用标签来实现:

代码语言:javascript
运行
AI代码解释
复制
this_instruction:
    adr x0, this_instruction // x0 <- address of this_instruction

AArch64堆栈指针称为sp。它并不完全是一个通用寄存器,但可以像少数特定指令那样使用(它被编码为寄存器31,大多数情况下是对零寄存器xzr进行编码,但有些指令是特殊大小写的,将其作为sp处理)。这包括一些基本的东西,比如movadd,所以您只需做mov x0, sp就可以得到它的当前值。

通用寄存器x29按惯例在需要时用作帧指针.您可以使用mov x0, x29检索它,也可以直接使用x29作为您喜欢的任何指令的输入。但是,请注意,不调用其他函数的“叶子”函数可能不会使用框架指针,在这种情况下,x29可能会指向调用函数的堆栈框架。

一般来说,像这样“翻译”x86代码,一次只看一条指令,并试图用完全相同的ARM来代替它,是不可能成功的。机器和/或调用约定的许多方面没有直接对应的内容。您必须退一步,找出x86代码作为一个整体要做什么,然后考虑如何在ARM上产生等效的行为。因此,不要在“此代码正在访问eip,等效于什么?”的级别上工作。相反,“这段代码试图执行系统调用/堆栈解压/上下文切换等等;在ARM上是如何实现的呢?”

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70307847

复制
相关文章
X86函数调用模型分析
的空间保存数据,地址从0x00000000到0xFFFFFFFF(一个十六进制为对应4个二进制位,所以是2的32次方)。
mingjie
2022/08/03
1.2K0
X86函数调用模型分析
X86如何实现函数调用?
的空间保存数据,用户地址空间3G从0x0000000到0xC0000000,内核空间1G从0xC0000000到0xFFFFFFFF。
mingjie
2022/11/30
2.8K0
X86如何实现函数调用?
堆栈基础(一)
本文稿费80软妹币 砸个广告:各位在网络安全方面有新创作的小伙伴,快将你们的心得砸过来吧~ 文章以word形式发至邮箱: minwei.wang@dbappsecurity.com.cn 有偿投稿,
安恒网络空间安全讲武堂
2018/06/26
7600
二进制基础
函数状态涉及到: esp, ebp, eip esp 存储函数调用栈的栈顶地址 ebp 存储当前函数状态的基地址 eip 存储下一条执行的指令的地址
HauHau
2022/01/12
3710
Linux syscall过程分析(万字长文)
为了安全,Linux 中分为用户态和内核态两种运行状态。对于普通进程,平时都是运行在用户态下,仅拥有基本的运行能力。当进行一些敏感操作,比如说要打开文件(open)然后进行写入(write)、分配内存(malloc)时,就会切换到内核态。内核态进行相应的检查,如果通过了,则按照进程的要求执行相应的操作,分配相应的资源。这种机制被称为系统调用,用户态进程发起调用,切换到内核态,内核态完成,返回用户态继续执行,是用户态唯一主动切换到内核态的合法手段(exception 和 interrupt 是被动切换)。
秃头哥编程
2019/08/23
14.9K1
ROP-SROP学习
其中sigreturn是一个系统调用,在类unix系统发生signal时候会被间接地调用。
偏有宸机
2020/11/04
1.3K0
ROP-SROP学习
Linux64位程序中的漏洞利用
之前在栈溢出漏洞的利用和缓解中介绍了栈溢出漏洞和一些常见的漏洞缓解 技术的原理和绕过方法, 不过当时主要针对32位程序(ELF32). 秉承着能用就不改的态度, IPv4还依然是互联网的主导, 更何况应用程序. 所以理解32位环境也是有必要的. 不过, 现在毕竟已经是2018年了, 64位程序也逐渐成为主流, 尤其是在Linux环境中. 因此本篇就来说说64位下的利用与32位下的利用和缓解绕过方法有何异同.
evilpan
2023/02/12
1.3K0
C/C++ 实现LyDebug动态PE调试器
LyDebug 是一款使用C/C++语言开发实现的命令行应用层动态反汇编调试器,通过运用Windows系统下的调试API函数并配合Capstone反汇编引擎,完美实现了x86与x64程序的调试功能,该调试器目前功能包括寄存器查看修改,软硬件断点的设置删除以及遍历,单步步进步过操作,堆栈检查,内存检查等。
王瑞MVP
2022/12/28
2260
C/C++ 实现LyDebug动态PE调试器
Linux下c语言中的main函数是如何被调用的
当我们在shell下执行一个程序的时候,shell内部首先会用fork系统调用来新建一个进程,然后再用execve系统调用把目标程序加载到内存中,并将其参数及环境变量等压入栈中,之后再执行目标程序的入口函数。
KINGYT
2019/05/30
3.3K0
Linux内核之旅/张凯捷——系统调用分析(2)
在《系统调用分析(1)》Linux内核之旅/张凯捷——系统调用分析(1)中,首先介绍了系统调用的概念,并对早期通过软中断(int 80)来进行系统调用的相关过程进行了分析,最后分析和介绍了为了提高系统调用的响应执行速度的两种机制——vsyscall和vDSO。
Linux阅码场
2019/10/08
2K0
Linux内核之旅/张凯捷——系统调用分析(2)
x86架构与x64架构在函数于栈中调用过程的不同之处
1、x86架构 x86架构是intel开发的一种32位的指令集。8个32位通用寄存器 eax,ebx,ecx,edx,ebp,esp,esi,edi。
Elapse
2020/08/17
1.9K0
前端魔法堂——调用栈,异常实例中的宝藏
前言  在上一篇《前端魔法堂——异常不仅仅是try/catch》中我们描述出一副异常及如何捕获异常的画像,但仅仅如此而已。试想一下,我们穷尽一切捕获异常实例,然后仅仅为告诉用户,运维和开发人员页面报了一个哪个哪个类型的错误吗?答案是否定的。我们的目的是收集刚刚足够的现场证据,好让我们能马上重现问题,快速修复,提供更优质的用户体验。那么问题就落在“收集足够的现场证据”,那么我们又需要哪些现场证据呢?那就是异常信息,调用栈和栈帧局部状态。(异常信息我们已经获取了)  本文将围绕上调用栈和栈帧局部状态叙述,准开
^_^肥仔John
2018/01/18
1.2K0
前端魔法堂——调用栈,异常实例中的宝藏
前言  在上一篇《前端魔法堂——异常不仅仅是try/catch》中我们描述出一副异常及如何捕获异常的画像,但仅仅如此而已。试想一下,我们穷尽一切捕获异常实例,然后仅仅为告诉用户,运维和开发人员页面报了一个哪个哪个类型的错误吗?答案是否定的。我们的目的是收集刚刚足够的现场证据,好让我们能马上重现问题,快速修复,提供更优质的用户体验。那么问题就落在“收集足够的现场证据”,那么我们又需要哪些现场证据呢?那就是异常信息,调用栈和栈帧局部状态。(异常信息我们已经获取了)  本文将围绕上调用栈和栈帧局部状态叙述,准开
^_^肥仔John
2018/07/11
1.1K0
一行代码,揭开CPU执行原理!
很多刚刚入坑的小白可能对此完全没有概念,或者模模糊糊知道个大概,我们写下的一行行代码,计算机到底是如何在执行的呢?
轩辕之风
2021/09/27
6990
一行代码,揭开CPU执行原理!
【嵌入式开发】ARM 芯片简介 (ARM芯片类型 | ARM处理器工作模式 | ARM 寄存器 | ARM 寻址)
博客地址 : http://blog.csdn.net/shulianghan/article/details/42375701
韩曙亮
2023/03/27
1.9K0
【嵌入式开发】ARM 芯片简介 (ARM芯片类型 | ARM处理器工作模式 | ARM 寄存器 |  ARM 寻址)
go语言调度器源代码情景分析之二:CPU寄存器
寄存器是CPU内部的存储单元,用于存放从内存读取而来的数据(包括指令)和CPU运算的中间结果,之所以要使用寄存器来临时存放数据而不是直接操作内存,一是因为CPU的工作原理决定了有些操作运算只能在CPU内部进行,二是因为CPU读写寄存器的速度比读写内存的速度快得多。
阿波张
2019/06/24
1.2K0
栈平衡和栈迁移
程序的运行需要数据,而数据就存放在内存中。首选的存放地址肯定是寄存器中(运行速度快),但是寄存器也就几个,数据很多,所以就把数据存放在了堆栈中。
ly0n
2020/11/04
1.2K0
栈平衡和栈迁移
RIP光栅图像处理器
RIP全称光栅图像处理器。它关系到输出的质量和速度,甚至整个系统的运行环境,可以说是彩色桌面出版系统的核心。
北山啦
2022/10/31
5790
RIP光栅图像处理器
64位下的InlineHook
关于64位程序.网上HOOK方法一大堆.这里也记录一下. 了解跨平台HOOK的真相与本质.
IBinary
2019/08/14
1.7K1
汇编和内存
你已经开了汇编学习的旅程,并且在前几章中你已经学习了汇编调用的一些黑魔法,你现在知道了,当一个函数被调用,他的参数和返回值是如何传递的。但是您还没学到的是将代码加载到内存后如何执行代码。
molier
2022/11/03
1.2K0
汇编和内存

相似问题

通过用户输入控制eip/rip寄存器

111

计算保存的ebp、eip和当前ebp

12

(缓冲区溢出攻击)无法覆盖$ebp和$eip寄存器

10

崩溃后查找%ebp (有%eip)

20

x86组件中rip寄存器和eip寄存器的区别

12
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文