2011-11-29 132 views
0

我只是在VS2010中查看我的C++程序的反彙編。那就是:dword ptr和dword ptr之間的區別:es

int main() 
{ 
00B613A0 push  ebp 
00B613A1 mov   ebp,esp 
00B613A3 sub   esp,0D4h 
00B613A9 push  ebx 
00B613AA push  esi 
00B613AB push  edi 
00B613AC lea   edi,[ebp-0D4h] 
00B613B2 mov   ecx,35h 
00B613B7 mov   eax,0CCCCCCCCh 
00B613BC rep stos dword ptr es:[edi] 
00B613BE mov   eax,dword ptr [___security_cookie (0B67000h)] 
00B613C3 xor   eax,ebp 
00B613C5 mov   dword ptr [ebp-4],eax 
    char temp[] = "hello"; 
00B613C8 mov   eax,dword ptr [string "hello" (0B6573Ch)] 
00B613CD mov   dword ptr [ebp-10h],eax 
00B613D0 mov   cx,word ptr ds:[0B65740h] 
00B613D7 mov   word ptr [ebp-0Ch],cx 

    return 0; 
00B613DB xor   eax,eax 
} 

有問題的線路有:

00B613BC rep stos dword ptr es:[edi] 

00B613D0 mov   cx,word ptr ds:[0B65740h] 

我不知道爲什麼他們使用dword ptr es:[edi]word ptr ds:[0B65740h]。雖然我知道dword ptr的意思,但我沒有得到最後添加的部分,:es:ds。現在我已經看過這個語法好幾次了,讓它不被人注意。

感謝,

Devjeet

回答

5

這些只是反彙編器的文物。 ES段寄存器已經是STOS指令使用的默認段寄存器,DS段寄存器已經是用於該MOV指令的默認段寄存器。很難說它是一個錯誤,但它肯定是不必要的,並且不一致地應用。我認爲這是由STOS指令的REP前綴和MOV指令的操作數大小前綴(16位而不是8或32)觸發的。段覆蓋也是一個前綴。

32位代碼使用平面內存模型,ES,DS,CS和SS段寄存器映射整個4千兆字節的地址空間。所以很少有理由需要段寄存器覆蓋。與16位代碼非常不同,其中段寄存器對於尋址超過64 KB的內存非常重要。您將在異常處理代碼中看到FS寄存器的段覆蓋。它指向線程信息塊FS:[0]包含當前的SEH幀。

1

ES暗示作爲重複的字符串操作目標段,但由於DS和ES,保證永遠是WIN32一樣,它其實並不重要,如果存在ES覆蓋(顯式或隱含)。

+0

哦!感謝您的回覆。還有一個問題,它是如何影響哪個細分市場的使用?我讀過的所有裝配書都沒有真正強調分段寄存器,所以我對它們不甚瞭解。 – devjeetroy