Разница между dword ptr и dword ptr: es - PullRequest
1 голос
/ 29 ноября 2011

Я только что проверял разборку моей программы на C ++ в VS2010. Вот оно:

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

Ответы [ 2 ]

5 голосов
/ 29 ноября 2011

Это просто артефакты дизассемблера. Регистр сегмента ES уже является регистром сегмента по умолчанию, используемым командой STOS, регистр сегмента DS уже является регистром сегмента по умолчанию, используемым для этой команды MOV. Трудно назвать это ошибкой, но это, безусловно, излишне и непоследовательно. Я считаю, что это вызвано префиксом REP для инструкции STOS и префиксом размера операнда для этой инструкции MOV (16 бит вместо 8 или 32). Переопределение сегмента также является префиксом.

32-битный код использует модель плоской памяти, регистры сегментов ES, DS, CS и SS отображают все 4 гигабайтное адресное пространство. Таким образом, очень мало причин для необходимости переопределения регистров сегмента. Очень отличается от 16-битного кода, где регистры сегментов важны, чтобы разрешить адресацию более 64 КБ памяти. Вы увидите переопределения сегментов для регистра FS в коде обработки исключений. Он указывает на блок информации о потоке, FS: [0] содержит текущий кадр SEH.

1 голос
/ 29 ноября 2011

ES подразумевается как сегмент назначения для повторяющихся строковых операций, но, поскольку DS и ES гарантированно всегда будут одинаковыми на WIN32, не имеет значения, присутствует ли переопределение ES (явное или подразумеваемое).

...