2015-05-05 102 views
2

我只是汇编语言的初学者,可能有些愚蠢的问题。这两条线有什么区别?汇编语言中的“ds:”的含义

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'是这种情况下的默认段,所以确实除了额外的前缀字节没有区别。而且,在典型的操作系统下,段'cs','ds','es'和'ss'都引用相同的内存。 – Jester

+0

@Jester只是想知道,什么是不同的内存段典型的操作系统。 – ST3

+0

例如,像DOS这样的实模式(如果你仍然可以称之为OS)。此外,段'fs'和/或'gs'用于特殊用途,例如线程本地存储,并且这些段通常位于偏移量处。 – Jester

回答

4

第一条指令的3E字节是DS段重载前缀(见英特尔软件开发手册中的“2.1.1指令前缀”)。

组2
- 段重载前缀:
•3EH-DS段重载前缀(与任何分支指令被保留使用)

在这种情况下,它是多余的,因为ds是大多数内存访问的默认段。另外,如果你有一个平坦的32位存储空间,你通常不会明确指定段寄存器,因为它们被设置为指向相同的内存。

+0

非常感谢。我认为类似的东西,但很好有确认。 – ST3