簡體   English   中英

匯編指令解釋

[英]Assembly Instruction interpretation

我看到以下指示:

*0x804a1a0(,%eax,4)

我得到了0x804a1a0的值,並加上了$ eax * 4的值,但這不是代碼跳轉到的地方。 我使用值0x804a1a0本身加上$ eax * 4進行了相同的操作,它指向其他位置。 我如何解釋以上說明?

簡短的答案:

你說:

我得到了0x804a1a0的值,並加上了$ eax * 4的值

錯了

我使用值0x804a1a0本身加上$ eax * 4進行了相同的操作

這也是錯誤的。

您想要的是先計算0x804a1a0 + eax*4 ,然后查看該內存位置的值。

長答案:

您提供的代碼不是完整的指令,而是AT&T語法中對move / jump / call指令的操作數。 更具體地說,它稱為有效地址 基本上,這是一種間接尋址的形式,這意味着將使用操作數給定位置的內存。

有效地址的AT&T語法為:

DISP(BASE,INDEX,SCALE)

應該解釋為:

BASE + INDEX*SCALE + DISP

就你而言

0x804a1a0(,%eax,4)

是真的:

%eax*4 + 0x804a1a0

現在針對* ,根據http://wiki.osdev.org/Opcode_syntax

相對尋址:默認在所有跳轉和調用指令中使用。

若要使用絕對尋址,操作數必須以星號(*)為前綴。

另外,來自http://en.wikipedia.org/wiki/Addressing_mode

絕對指令地址的有效地址是地址參數本身,未經修改。

因此,最終地址實際上是eax*4 + 0x804a1a0指向的位置。

如果我不得不猜測,我會說這可能是偏移量為0x804a1a0的跳轉/切換表。 換句話說,該代碼不會以eax*4 + 0x804a1a0偏移量執行,而是讀取存儲在該位置的地址,然后跳轉到該地址(因此是間接跳轉 )。

旁白 :我真的很討厭AT&T語法。 如果您不熟悉匯編,則可能更喜歡Intel語法。 我認為它更具可讀性。 您使用Intel語法的代碼可能是:

jmp dword ptr [0x804a1a0 + eax*4]

假設指令是跳轉。

暫無
暫無

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

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