簡體   English   中英

如果我在 x86 AT&T 語法中省略比例因子和索引尋址模式會發生什么?

[英]What happens if I omit the scale factor of and indexed addressing mode in x86 AT&T syntax?

我是組裝新手,我正在從Programming from the Ground Up中學習它。 在第 41 和 42 頁,這本書討論了索引尋址模式。

memory 地址引用的一般形式是: ADDRESS_OR_OFFSET(%BASE_OR_OFFSET,%INDEX,MULTIPLIER)
所有字段都是可選的。 要計算地址,只需執行以下計算:
FINAL ADDRESS = ADDRESS_OR_OFFSET + %BASE_OR_OFFSET + MULTIPLIER * %INDEX
ADDRESS_OR_OFFSET 和 MULTIPLIER 都必須是常量,而另外兩個必須是寄存器。 如果遺漏了任何部分,則在等式中將其替換為零。

所以我決定玩一下這個。 我寫了以下一段代碼:

.code32
.section .data
str:
    .ascii "Hello world\0"

.section .text
.global _start
_start:
    movl $2, %ecx       # The index register.
    mov str(, %ecx, ), %bl
    movl $1, %eax
    int $0x80

我希望得到 72(H 的 ASCII 代碼)作為程序的退出結果,因為沒有任何乘數(根據本書,應該用零代替)。 但令人驚訝的是,我得到了 108(l 的 ASCII 碼)。 我認為這可能是一個.ascii的東西,並試圖看看我是否可以使用不同的數據類型得到不同的結果。 我也得到了與.byte相同的結果。

我嘗試使用 AT&T 語法在 x86 程序集中查找索引尋址模式,但我找不到任何有用的東西(可能是因為我不知道要搜索什么)。

是我遺漏了什么還是書中有錯誤? 鑒於我是這個領域的新手,如果你能詳細說明,我真的很感激。

如果遺漏了任何部分,則在等式中將其替換為零。

本書的一般規則對於比例因子並不十分准確。 如果省略,默認比例因子為1

x86 索引縮放在機器代碼中作為 2 位移位計數工作。
該 asm 默認值為<< 0移位計數但 x86 asm 源代碼語法(包括 AT&T)使用乘數而不是移位計數來表示這一點,並且i << 0i * 1

如果您不需要索引,則需要在尋址模式中省略索引寄存器。


請注意,具有默認值是匯編程序/語法的屬性,在這種情況下是 AT&T,而不是 x86 本身的屬性。 機器代碼中不能有“默認值” - 無法在字節中省略位,它們必須為 0 或 1。您要么有一個包含所有字段的 SIB 字節(標度索引基),或者你沒有(由 ModRM 字節表示)在這種情況下根本沒有索引。

有一種 SIB 編碼表示無索引,因此在機器代碼中,您仍然可以有一個完全沒有索引的 SIB 字節,但您不會將其描述為零的乘數。

一些反匯編程序將編碼表示為 index = %eiz ,例如在nopl 0(%eax, %eiz, 1)中表示有一個 SIB 字節但沒有索引,但通常你只會看到 NOPS。 需要編碼(%esp)的 SIB-with-no-index 時,它會被簡化為。)


x86 機器碼有多種語法。 盡管我所知道的所有人都同意沒有比例只是意味着 shift=0,例如英特爾語法中的[str + eax + ecx] 通常,如果有超過 1 個,則選擇第一個寄存器作為基數,第二個作為索引。

當然,在 Intel 語法中,要強制 ECX 成為沒有基址寄存器的索引,您需要使用[str + ecx*1]故意在 SIB 編碼上浪費一個字節。
英特爾中的[str + ecx]是 AT&T str(%ecx)


還有相關的:

暫無
暫無

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

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