[英]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.