2015-05-05 127 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