簡體   English   中英

了解x86 MOV語法

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

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