标题##What相当于eip,rip寄存器用于英特尔CPU,但用于ARM/Aaarch64CPU?
我需要翻译一个为英特尔CPU编写的应用程序,它使用32位eip或64位rip寄存器。
这些方法使用英特尔寄存器:
函数GetInstructionPointerRegisterValue -->用途: regs32eip或regs64rip。
函数GetStackBasePointerRegisterValue -->用途: regs32ebp或regs64rbp
函数GetStackPointerRegisterValue -->用途: regs32UESP或regs64rsp。
我应该为ARM/Aaarch64使用什么类似的寄存器?
它是否存在一个具有比较和等价的x86/ And 64寄存器与arm/aarch64寄存器的表?
谢谢。
发布于 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的可变长度指令编码来缩短指令。
发布于 2021-12-12 10:04:04
AArch64等价于x86指令指针是程序计数器寄存器pc
。与ARM32不同,pc
不是一个通用寄存器,不能与mov
这样的普通指令一起使用.但是,如果您需要它的“当前值”,即当前指令的地址(或下一个指令,无论您喜欢哪一个),您可以使用adr
指令来完成这一任务,该指令返回pc
的值加上一个立即偏移量。(这里的adrp
只会给你带来高52位的信息。)我认为大多数汇编程序不会让您直接将偏移量指定为0,但您可以使用标签来实现:
this_instruction:
adr x0, this_instruction // x0 <- address of this_instruction
AArch64堆栈指针称为sp
。它并不完全是一个通用寄存器,但可以像少数特定指令那样使用(它被编码为寄存器31,大多数情况下是对零寄存器xzr
进行编码,但有些指令是特殊大小写的,将其作为sp
处理)。这包括一些基本的东西,比如mov
、add
,所以您只需做mov x0, sp
就可以得到它的当前值。
通用寄存器x29
按惯例在需要时用作帧指针.您可以使用mov x0, x29
检索它,也可以直接使用x29
作为您喜欢的任何指令的输入。但是,请注意,不调用其他函数的“叶子”函数可能不会使用框架指针,在这种情况下,x29
可能会指向调用函数的堆栈框架。
一般来说,像这样“翻译”x86代码,一次只看一条指令,并试图用完全相同的ARM来代替它,是不可能成功的。机器和/或调用约定的许多方面没有直接对应的内容。您必须退一步,找出x86代码作为一个整体要做什么,然后考虑如何在ARM上产生等效的行为。因此,不要在“此代码正在访问eip,等效于什么?”的级别上工作。相反,“这段代码试图执行系统调用/堆栈解压/上下文切换等等;在ARM上是如何实现的呢?”
https://stackoverflow.com/questions/70307847
复制