2011-02-04 127 views
7

目前我正在學習x86彙編以獲得樂趣,我很喜歡單片機編程,所以我對彙編很熟悉。彙編:使用數據段寄存器(DS)

目前我一直在尋找答案這個問題的高和低,但似乎無法找到它... DS註冊,我知道它應該指向我的程序中的全球數據,但我不知道它是如何工作的。我使用NASM,並在最簡單的程序我看到以下內容:

 
[org 0x7C00] 
[bits 16] 

main: 
mov ax, 0x0000 
mov ds, ax 
mov al, [msg] 
mov ah, 0x0E 
mov bx, 0x0007 
int 0x10  
jmp $ 

msg db 'X' 

times 510-($-$$) db 0 
dw 0xAA55 

和完美的作品(即使我省略了粗體顯示的代碼),但如何? CPU是否自動加載從0x0000開始的全局變量?或者是否有內在的東西,我錯過了?

+0

可能的重複:http://stackoverflow.com/questions/3819699/what-does-ds40207a-mean-in-assembly,http://stackoverflow.com/questions/4119504/real-mode-memory-addressing -explanation/33581044#33581044 – 2015-11-07 09:19:59

回答

12

當計算機處於實模式(CPU執行引導加載程序時CPU所處的模式)時,CPU用來計算地址的方法非常簡單:將段寄存器值乘以16(移位位4位向左),然後添加偏移量。例如,在像「mov ax,[0x1234]」這樣的指令中,CPU將使用「DS * 0x10 + 0x1234」作爲有效地址(第一項在你的情況下解析爲零)。當你有一個像「mov ax,[BP + 0x32]」,那麼CPU將使用「SS * 0x10 + BP + 0x32」。請注意,現在CPU使用了不同的段寄存器(堆棧段),這是因爲當使用BP寄存器時,CPU假設你不想在默認情況下訪問堆棧(但可以使用[DS :BP + 0x32])。

更多更少我已經解釋,更多可以在http://wiki.osdev.org/Real_Modehttp://www.internals.com/articles/protmode/realmode.htm和很多更多的地方找到。

順便說一句,「msg」應該或多或少位於0x7C11地址。

+0

謝謝!這完全回答了我的問題^ _ ^。 – 2011-02-05 07:18:51