2012-01-11 166 views
1

我在Windows上有以下彙編代碼,我想確保我理解正確。 edi包含一些地址即0x6090F454eax在mov後有什麼eax,dword ptr [edi]

在這種情況下,我們應該eax有第一mov指令後?

775672f3 mov eax,dword ptr [edi] 

775672f5 mov dword ptr [ebp-50h],0 
775672fc mov dword ptr [ebp-48h],0 

77567303 cmp eax,0FFFFFFFFh 

在我看來,eax必須有價值,但我不太確定。 爲了您的信息,C++爲上述彙編代碼

if (sem->num != INVALID_FLAG) { 
    .... 
} 

而且,這裏是什麼在EDI店。

0:024> dd edi 
6090f454 0c0e8fe0 ffffffff 00000000 00000000 

在此先感謝您。

回答

3

行:

mov eax,dword ptr [edi] 

只會加載無論是存儲在地址edi。所以這是一個簡單的數據加載。

由於您沒有顯示地址edi0x6090F434)上的內容,因此我們無法準確告訴您什麼是eax

根據給出的C++代碼,它看起來像edinum字段的地址。因此它將num讀入一個寄存器,然後將其與0xFFFFFFFF進行比較,這是INVALID_FLAG的常數。

+0

我寫了edi時出現了錯字。 edi實際上是6090f454。 以下是存儲在edi中的內容。 6090f454 0c0e8fe0 ffffffff 00000000 00000000 – istudy0 2012-01-11 19:12:46

+0

等一下,這沒有任何意義,'edi'只有32位。它不能存儲所有的'6090f454 0c0e8fe0 ffffffff 00000000 00000000'。這只是一個註冊轉儲? – Mysticial 2012-01-11 19:23:37

+0

對不起,我感到困惑。我編輯的原始問題更清楚。謝謝。 – istudy0 2012-01-11 19:25:42

2

EAX將在0x6090F434處包含32位值,假定地址是'exists',即內存被分配給您在該地址的進程。

這似乎很明顯,所以我想知道這是否真的是你想知道的?

+1

是的,這就是我想知道的。非常感謝。 – istudy0 2012-01-11 18:58:54

1

下面是張貼由你的彙編代碼的描述:

mov eax,dword ptr [edi] 

移動存儲在包含在所述EDI寄存器eax寄存器存儲器地址的值。

你的WinDbg輸出爲EDI寄存器顯示:

6090f454 0c0e8fe0 FFFFFFFF 00000000 00000000

這裏的第一個值是包含在EDI寄存器中的內存地址。下一個值0c0e8fe0是位於該內存地址的雙字。

更簡單的方式來理解和可視化將是:

dword ptr [edi] = 0c0e8fe0 
dword ptr [edi+4] = ffffffff 
dword ptr [edi+8] = 00000000 

所以,DD命令顯示你在第一列和DWORD數據的地址在接下來的4列。

該彙編語言指令,

mov eax, dword ptr [edi] 

將值0c0e8fe0移入eax寄存器。

類似地,彙編語言代碼中的下2條指令將分別在ebp-50和ebp-48指向的存儲器地址處存儲值0。

通常,[ebp-4],[ebp-8]等用於引用程序中的局部變量。

的最後一條指令,

cmp eax,0FFFFFFFFh 

比較存儲在EAX寄存器是,0c0e8fe0與0FFFFFFFFH的雙字。在這種情況下,這些值不相等,因此不會設置零標記。

通常在彙編語言代碼中,cmp指令後跟一個條件跳轉,用於檢查標誌狀態。

因此,您可以在cmp指令之後有jz或jnz指令。

希望這有助於您從彙編語言代碼中獲得更多意義。

相關問題