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



标题##用于英特尔CPU但用于ARM/Aarch64 CPU的eiprip寄存器的等价物是什么

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

Thoses方法使用intel寄存器:

函数GetInstructionPointerRegisterValue-->使用:regs32[eip]或regs64[rip]。

函数GetStackBasePointerRegisterValue-->使用:regs32[ebp]或regs64[rbp]

函数GetStackPointerRegisterValue-->使用:regs32[UESP]或regs64[rsp]。

ARM ARM/Aarch64应该使用什么类似的寄存器?

它是否存在一个表,其中包含x86/amd64寄存器与arm/arch64寄存器的比较和等效性?

谢谢。

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

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

ARM和AArch64没有许多/任何隐含地使用除堆栈指针之外的任何特定通用寄存器的指令;等价表";使用x86-64将非常短。例如,与x86shl r/m, cl不同,您不需要特定寄存器中的值来进行移位,更像x86 BMI2shlx reg, reg/mem, reg,但没有CISC使用内存源的能力。ARM和AArch64从一开始就选择了一种更正交的设计,而不是像x86那样对不同的寄存器进行大量隐式使用,以允许使用x86的可变长度指令编码的较短指令。

aarch64

等效于x86指令指针的AArch64是程序计数器寄存器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(。这包括movadd等基本内容,因此您只需执行mov x0, sp即可获得其当前值。

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


一般来说;翻译";像这样的x86代码,一次只看一条指令,并试图用一个完全等效的ARM来替换它,是不太可能成功的。机器和/或调用约定的许多方面都没有直接的等价物。你真的必须退一步,弄清楚x86代码作为一个整体试图做什么,然后思考如何在ARM上产生等效的行为。所以不要在";这段代码正在访问eip,等价物是什么&";。而是";这段代码试图进行系统调用/堆栈展开/上下文切换等;如何在ARM上做到这一点">

最新更新