2017-11-18 325 views
1

我有這樣的代碼,是應該打印一個字符串的第一個字母:空的結束改變了串

mov bx, message ; Move the address of the message to bx   
add bx, 0x7c00 ; Adding the padding of bootsector to bx 
mov al, [bx]  ; Move the value at the address in bx to al 
int 0x10   ; Interrupt drawing the character in al to screen 

爲什麼不這項工作:

message: 
    db "Test", 0 

但這個工程:

message: 
    db "Test", 0, 0 

第一個打印一些隨機字符,第二個總是我的消息的第一個字母。

該代碼與NASM一起編譯到.bin中,並作爲Bochs中的引導扇區運行。

**編輯

全碼:

mov ah, 0x0e 

message: 
    db 'Booting MainOPS', 0 

printTheMessage: 
    mov bx, message 
    add bx, 0x7c00 
    mov al, [bx] 
    int 0x10 

jmp $ 

times 510 - ($-$$) db 0 

dw 0xaa55 
+3

這不是[MCVE]。你很可能將您的字符串放入代碼路徑中。更多的人這樣做比我想象的要多。另外,學會使用bochs調試器。 – Jester

+0

@Jester我加了整個代碼。它基本上沒有區別,因爲它幾乎是我的整個代碼。是的,任何事情都可能我不是專業人士,所以這可能是愚蠢的。我正在學習如何使用它。 – Maineri

+2

btw,在開始時使用'[org 0x7c00]'來避免必須通過'add bx,0x7c00' ...來調整偏移量...(但是即使這樣也只能用於更常見的BIOS,因爲一些罕見的將不會從' 0000:7C00',但其他東西像'07C0:0000',所以從'cs'複製的'ds'將會出錯......等等,你根本就沒有設置ds,這是另一個主要問題,你很幸運,Bochs是如此「自然」的環境,在寄存器中啓動你的啓動加載器,並具有常識值。編寫*魯棒性*引導程序相當棘手。 – Ped7g

回答

1

這就像@Jester猜測。您執行message,因爲它是代碼。代碼執行從mov ah, 0x0e開始,然後直接跟在它後面的字節,即字符串'Booting MainOPS', 0,然後是printTheMessage代碼。

要麼將​​message移動到無限循環後,要麼在第一條指令後面添加jmpprintTheMessage

+0

哦,我明白了......謝謝! – Maineri