Assembly dword ptr和dword ptr之间的差异:es 我只是检查了VS2010中的C++程序的拆卸。这是: 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 }

Assembly dword ptr和dword ptr之间的差异:es 我只是检查了VS2010中的C++程序的拆卸。这是: 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 },assembly,masm32,Assembly,Masm32,所涉及的线路是: 00B613BC rep stos dword ptr es:[edi] 00B613D0 mov cx,word ptr ds:[0B65740h] 我不明白他们为什么使用dword ptr es:[edi]和单词ptr ds:[0B65740h]。虽然我知道dword ptr的意思,但我没有得到添加的最后一部分:es和:ds。现在我已经多次看到这种语法,让它不被注意到 谢谢 DevjeetES被暗示为重复字符串操作的目标段,但由于DS和E

所涉及的线路是:

00B613BC  rep stos    dword ptr es:[edi]  

00B613D0  mov         cx,word ptr ds:[0B65740h] 
我不明白他们为什么使用dword ptr es:[edi]和单词ptr ds:[0B65740h]。虽然我知道dword ptr的意思,但我没有得到添加的最后一部分:es和:ds。现在我已经多次看到这种语法,让它不被注意到

谢谢


Devjeet

ES被暗示为重复字符串操作的目标段,但由于DS和ES在WIN32上保证始终相同,因此ES重写是显式的还是暗示的并不重要。

ES被暗示为重复字符串操作的目标段,但由于DS和ES在WIN32上保证始终相同,因此ES重写是显式的还是隐含的并不重要。

这些只是反汇编程序的工件。ES段寄存器已经是STOS指令使用的默认段寄存器,DS段寄存器已经是该MOV指令使用的默认段寄存器。很难称之为bug,但它肯定是不必要的,并且应用不一致。我认为这是由STOS指令的REP前缀和MOV指令的操作数大小前缀触发的,该前缀为16位,而不是8位或32位。段替代也是一个前缀


32位代码使用平面内存模型,ES、DS、CS和SS段寄存器映射整个4GB地址空间。因此,几乎没有理由需要段寄存器覆盖。与16位代码非常不同,在16位代码中,段寄存器对于允许寻址超过64 KB的内存非常重要。您将在异常处理代码中看到FS寄存器的段重写。它指向线程信息块,FS:[0]包含当前SEH帧

这些只是反汇编程序的工件。ES段寄存器已经是STOS指令使用的默认段寄存器,DS段寄存器已经是该MOV指令使用的默认段寄存器。很难称之为bug,但它肯定是不必要的,并且应用不一致。我认为这是由STOS指令的REP前缀和MOV指令的操作数大小前缀触发的,该前缀为16位,而不是8位或32位。段替代也是一个前缀


32位代码使用平面内存模型,ES、DS、CS和SS段寄存器映射整个4GB地址空间。因此,几乎没有理由需要段寄存器覆盖。与16位代码非常不同,在16位代码中,段寄存器对于允许寻址超过64 KB的内存非常重要。您将在异常处理代码中看到FS寄存器的段重写。它指向线程信息块,FS:[0]包含当前SEH帧

哦!!谢谢你的回复。还有一个问题,使用哪一段会有什么不同?我读过的汇编书籍都没有真正强调段寄存器,所以我对它们了解不多。哦!谢谢你的回复。还有一个问题,使用哪一段会有什么不同?我读过的汇编书籍中没有一本真正强调段寄存器,所以我对它们了解不多。