標題##什么相當于eip,用于 Intel CPU 但用于 ARM/Aaarch64 CPU 的rip暫存器?
我需要翻譯為使用 32 位eip或 64 位rip暫存器的Intel CPU 撰寫的應用程式。
這些方法使用英特爾暫存器:
函式 GetInstructionPointerRegisterValue --> 使用:regs32[eip] 或 regs64[rip]。
函式 GetStackBasePointerRegisterValue --> 使用:regs32[ebp] 或 regs64[rbp]
函式 GetStackPointerRegisterValue --> 使用:regs32[UESP] 或 regs64[rsp]。
我應該為 ARM ARM/Aaarch64 使用什么類似的暫存器?
是否存在 x86/amd64 暫存器與 arm/aarch64 暫存器的比較和等價表?
謝謝。
uj5u.com熱心網友回復:
ARM/AArch64 上的程式計數器稱為 PC。
ARM 具有有限范圍的 PC 相對尋址模式。我認為 AArch64 也可以,但它也具有將adrpPC 相對地址生成到另一個暫存器中的功能,例如 x86-64 RIP 相對 LEA。
ARM 和 AArch64 沒有很多/任何隱式使用除堆疊指標之外的任何特定通用暫存器的指令,因此 x86-64 的“等效表”將非常短。shl r/m, cl例如,與 x86 不同,您不需要特定暫存器中的值來對其進行移位,更像 x86 BMI2,shlx reg, reg/mem, reg但沒有 CISC 使用記憶體源的能力。ARM 和 AArch64 選擇了一種更正交的設計作為開始,而不是像 x86 那樣對不同的暫存器進行大量隱式使用,以允許使用 x86 的可變長度指令編碼的更短指令。
uj5u.com熱心網友回復:
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反而)。這包括諸如mov, 之類的基本內容,add因此您只需執行mov x0, sp即可獲取其當前值。
按照x29慣例,通用暫存器在需要時用作幀指標。您可以mov x0, x29使用它來檢索它,也可以x29直接將其用作您喜歡的任何指令的輸入。但是,請注意,不呼叫其他函式的“葉”函式可能不使用幀指標,在這種情況下,它x29可能指向呼叫函式的堆疊幀。
一般來說,像這樣“翻譯”x86 代碼,一次只查看一條指令,并試圖用一個精確的 ARM 等效項替換它,不太可能成功。機器和/或呼叫約定的許多方面沒有直接的等價物。你真的必須退后一步,弄清楚 x86 代碼作為一個整體試圖做什么,然后考慮如何在 ARM 上產生等效的行為。所以不要在“這段代碼正在訪問eip,等價于什么?”的層面上作業。而是“這段代碼試圖進行系統呼叫/堆疊展開/背景關系切換等;如何在 ARM 上做到這一點?”
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/384833.html
下一篇:nasm不能在函式中呼叫函式
