汇编语言中 "ds:" 的含义是什么?

10

我只是汇编语言的初学者,可能会有一些傻瓜问题。这两行代码有什么区别?

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;
}

我的猜想得到了确认,所以想问一下你们,有什么区别吗?为什么我们需要两个执行相同但具有不同长度操作码的指令。


2
在这种情况下,ds 是默认段,因此除了额外的前缀字节之外,实际上没有任何区别。此外,在典型的操作系统下,段 csdsesss 都引用相同的内存。 - Jester
@Jester,我只是好奇,有哪些不典型的操作系统,其中在不同的内存中有不同的段。 - ST3
1
例如,像DOS这样的实模式(如果你仍然可以称呼它为操作系统)。此外,段fs和/或gs用于特殊目的,例如线程本地存储,并且通常放置在偏移量处。 - Jester
仅有主流操作系统使用非平凡段的是MS-DOS和Windows 3.x。但那时候它们都是16位,所以通常不会使用32位寄存器eax等。 - Seva Alekseyev
可能是What does "DS:[40207A]" mean in assembly?的重复问题。 - user202729
2个回答

6
在第一条指令中,3E字节是一个DS段覆盖前缀(请参阅英特尔软件开发手册中的“2.1.1指令前缀”)。
引用如下: 第二组: - 段覆盖前缀: - 3EH—DS段覆盖前缀(保留,可与任何分支指令一起使用)
在这种情况下,它是多余的,因为对于大多数内存访问,ds是默认段。此外,如果您拥有平坦的32位内存空间,则通常不需要明确指定段寄存器,因为它们已被设置为指向相同的内存。

非常感谢。我也有类似的想法,但确认一下还是很好的。 - ST3

3

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接