我只是汇编语言的初学者,可能有一些愚蠢的问题。这两行有什么区别?
3e 8b 06 mov eax,DWORD PTR ds:[esi]
8b 06 mov eax,DWORD PTR [esi]
Run Code Online (Sandbox Code Playgroud)
在我看来它也是如此,我也尝试过这个程序:
int main()
{
__asm
{
mov esi, ebx
mov eax,DWORD PTR [esi]
mov ebx,DWORD PTR ds:[esi]
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这证实了我的猜测,所以问问你们,如果有什么不同。为什么我们需要两条执行相同但具有不同长度操作码的指令。
3E第一条指令中的字节是DS段覆盖前缀(请参阅英特尔软件开发人员手册中的“2.1.1 指令前缀”)。
第 2 组
— 段覆盖前缀:
• 3EH — DS 段覆盖前缀(保留与任何分支指令一起使用)
在这种情况下,它是多余的,因为它ds是大多数内存访问的默认段。此外,如果您有一个平坦的 32 位内存空间,您通常永远不会明确指定段寄存器,因为无论如何它们都被设置为指向相同的内存。