【发布时间】:2015-05-05 10:30:30
【问题描述】:
我只是汇编语言的初学者,可能有一些愚蠢的问题。这两行有什么区别?
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段都引用相同的内存。 -
@Jester 只是想知道,不同内存中的段不是典型的操作系统。
-
例如,一个实模式,如 DOS(如果您仍然可以称其为操作系统)。此外,段
fs和/或gs用于特殊目的,例如线程本地存储,它们通常放置在偏移处。 -
唯一不平凡地使用段的主流操作系统是 MS-DOS 和 Windows 3.x。但是,那些是 16 位的,所以通常不使用 32 位寄存器 eax 等。