我只是汇编语言的初学者,可能会有一些傻瓜问题。这两行代码有什么区别?
3e 8b 06 mov eax,DWORD PTR ds:[esi]
8b 06 mov eax,DWORD PTR [esi]
在我看来,这个程序可以做同样的事情,我也试过这个程序:
int main()
{
__asm
{
mov esi, ebx
mov eax,DWORD PTR [esi]
mov ebx,DWORD PTR ds:[esi]
}
return 0;
}
我的猜想得到了确认,所以想问一下你们,有什么区别吗?为什么我们需要两个执行相同但具有不同长度操作码的指令。
ds
是默认段,因此除了额外的前缀字节之外,实际上没有任何区别。此外,在典型的操作系统下,段cs
、ds
、es
和ss
都引用相同的内存。 - Jesterfs
和/或gs
用于特殊目的,例如线程本地存储,并且通常放置在偏移量处。 - Jester