[英]Understanding x86 MOV Syntax
我認為這個問題很簡單(也許是愚蠢的)可以回答,但經過近兩個小時的Google-ing后,我已經退出了。 我很確定我的問題是因為我只是不明白語法在做什么。
我正在看IDA中的一些反匯編代碼,我不知道以下是做什么的:
mov dl, byte_404580[eax]
如果我跳轉到byte_404580
我發現.data:00404580 byte_404580 db 69h
告訴我該值為0x69
。 但我不知道如何使用它。
讓我提供此代碼出現的上下文:
mov eax, 0x73 ; Move hex 73 to EAX
and eax, 0x0F ; Keep lower half of EAX
mov dl, byte_404580[eax] ; MAGIC
由於上述假設EAX
最初為0x73,我得到DL
= 0x76。 我試過改變EAX
的值來找到一些模式,但我無法弄清楚發生了什么。
此語法用於表示內存尋址,類似於C的數組語法( array[index]
)。 您的示例等效於計算表達式0x404580 + (eax & 0x0F)
,將其視為地址,並從該地址獲取一個字節。 這表明0x404580
處的數據是一個字節數組(最可能是0x10
元素,基於掩碼)。
如果能回答你的問題,你可以在這里停止閱讀。
如果進入選項>常規並將“顯示操作碼字節”設置為非零值,您將看到指令字節的實際值,並能夠與處理器文檔交叉引用它們以了解發生了什么。 這通常不是必需的,但它可以是教育性的。 例如:
mov dl, byte_404580[eax]
可以表示為字節序列:
8A 14 05 80 45 40 00
使用英特爾體系結構手冊第2A卷 ,可以按如下方式解碼:
8A - instruction opcode for MOV r8, r/m8 - determines the operand sizes
14 - the Mod R/M byte:
| 00010100b
Mod | 00
R/M | 100
Reg | 010
Mod R/M combination 00-100 is specified as "followed by the SIB byte".
Reg 010 stands for register DL/DX/EDX, the destination operand.
05 - the SIB byte:
| 00000101b
Scale | 00
Index | 000
Base | 101
This combination is specified as [scaled value of EAX] + a 32 bit displacement.
80 45 40 00 - the displacement itself, 0x404580
將這些添加到一起,您會得到:
該指令從EAX + 0x404580
獲取一個字節並將其移入DL
寄存器。
IDA使用此信息來推斷在0x404580
處有一個字節大小的值數組,如果它還沒有名稱,則嘗試命名該位置,嘗試調整該位置的命名項以調整正確的字節數(它不一定知道這個數組中有多少個元素,所以它實際上並沒有創建一個數組)並將顯示的表達式轉換為byte_404580[eax]
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.