簡體   English   中英

X86_64 - 匯編 - 為什么位移不是 64 位?

[英]X86_64 - assembly - Why displacement not 64 bits?

我正在閱讀Intel x86_64 指南 vol.1以刷新內存尋址的工作方式。

仍然,

3.7.5 指定偏移

內存地址的偏移部分可以直接指定為靜態值(稱為位移)或通過由以下一個或多個組件組成的地址計算指定:

• 位移— 8 位、16 位或32 位值。

我在Agner Fog 的匯編指南中讀到,當與 (r/e)ax 寄存器一起使用時,64 位絕對尋址是可能的。

所以..

是否可以使用帶有 64 位地址的絕對尋址來 jmp、mov 和 call(使用所有寄存器),或者我是否必須繼續使用 Base + 位移組合

只有進出累加器的移動具有 64 位絕對地址變量。
所有其他移動僅限於 32 位位移方法。

請注意, mov absolute_addr64, %rax適用於以rax作為目標的情況。
mov $imm64, %reg可用於任何寄存器。
請參閱從 64 位地址加載到 rax 以外的其他寄存器,以及為什么我們不能將 64 位立即數移動到內存中?

AMD在設計AMD64架構的時候,基本都說2GB的代碼應該夠大家用了。 (每個可執行文件和每個共享庫;沒有靜態鏈接在一起的事物之間的調用通常需要通過完整的 64 位地址進行間接訪問。)

https://gitlab.com/x86-psABI/x86-64-ABI描述了 x86-64 System V ABI 的小型、中型和大型代碼模型(用於所有非 Windows 系統)。

  • small:每次跳轉、調用和內存位移的正常 32 位相對位移。 (已知所有符號都位於02^31 - 2^24 - 1 )。

  • 中:小代碼,但數據部分分為兩部分:常規和大( .ldatalrodata.lbss )。

這種模型需要編譯器使用movabs指令來訪問大的靜態數據並將地址加載到寄存器中,但保留了小代碼模型的優點,用於處理小數據和文本部分的地址(分支特別需要)

默認情況下,只有大於 65535 字節的數據才會放入大數據部分

  • 大的:

編譯器需要使用movabs指令,就像在中等代碼模型中一樣,即使是處理文本部分內的地址也是如此。 此外,當分支到與當前指令指針的偏移量未知的地址時,需要間接分支。

可以通過將程序分解成多個共享庫來避免中小型模型中文本部分的限制,因此該模型僅在單個函數的文本變得大於中型模型允許的情況下才被嚴格要求。

中型PIC需要movabs / lea / add生成大於32位位移的RIP相對地址。

大型 PIC 也需要它來尋址全局偏移表和過程鏈接表。

我認為 x86 架構沒有 64 位位移或偏移。

原因很簡單:這些提供的“輕松”編程並不經常發生。 從統計上講,您需要的大多數偏移量都非常小。 當您需要 64 位偏移量(很少)時,您始終可以使用 ADD 指令進行模擬,而幾乎沒有性能損失。 做 64 位偏移的晶體管最好花在做其他事情上。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM