"ds:"在汇编语言中的含义

Meaning of "ds:" in assembly language

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

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

也证实了我的猜测,所以问问大家,有什么不同。为什么我们需要两条功能相同但操作码长度不同的指令。

1) DS = 数据段

2) 两个不同的操作码,因为两个不同的"adressing modes"。 3) 这是两种不同类型的基于 x86 er 的所谓 "adressing modes"。 asm 中的一个非常基础的东西。

一) https://cs.nyu.edu/courses/fall10/V22.0201-002/addressing_modes.pdf b) http://www.ic.unicamp.br/~celio/mc404s2-03/addr_modes/intel_addr.html

第一条指令中的 3E 字节是 DS 段覆盖前缀(请参阅英特尔软件开发人员手册中的“2.1.1 指令前缀”)。

Group 2
— Segment override prefixes:
• 3EH—DS segment override prefix (use with any branch instruction is reserved)

在这种情况下它是多余的,因为 ds 是大多数内存访问的默认段。此外,如果你有一个平面 32 位内存 space 你通常永远不会明确指定段寄存器,因为它们无论如何都设置为指向相同的内存。