2017-02-16 67 views
2

我想學習一個簡單的helloworld引導程序程序。指這link。我已經使用nasm彙編器成功生成了這個彙編代碼的二進制文件,並使用仿真器bochs運行,它工作正常。 但是,當我直接用硬盤做同樣的事情時,我無法將字符串打印到屏幕上。打印helloworld的基本引導程序程序不起作用

請在下面找到我用過的代碼。

[BITS 16] 
[ORG 0x7C00] 

MOV SI, HelloString 
CALL PrintString 
JMP $ 

PrintCharacter: 
    MOV AH, 0x0E 
    MOV BH, 0x00 
    MOV BL, 0x07 
    INT 0x10 
    RET 

PrintString: 
next_character: 
    MOV AL, [SI] 
    INC SI 
    CALL PrintCharacter 
    OR AL, AL 
    JZ exit_function 
    JMP next_character 
exit_function: 
    RET 

HelloString db "Pell",0 

TIMES 510 - ($ - $$) db 0 
DW 0xAA55 
+4

像往常一樣,你忘了初始化'DS'。 – Jester

+0

您能否介紹一下DS的功能?我是初學者。 – skesh

+1

我在另一個SO答案中有[Bootloader Tips](http://stackoverflow.com/a/32705076/3857942)。可能需要設置像_DS_一樣的段寄存器。當你說硬盤驅動器,你的意思是你在真正的硬件上啓動? –

回答

0

您需要在執行其他任何操作之前初始化段寄存器,否則程序將因爲無法訪問數據而崩潰。

[BITS 16] 
[ORG 0x7C00] 

XOR AX, AX 
MOV DS, AX 

MOV SI, HelloString 
CALL PrintString 
JMP $ 

PrintCharacter: 
    MOV AH, 0x0E 
    MOV BH, 0x00 
    MOV BL, 0x07 
    INT 0x10 
    RET 

PrintString: 
next_character: 
    MOV AL, [SI] 
    INC SI 
    CALL PrintCharacter 
    OR AL, AL 
    JZ exit_function 
    JMP next_character 
exit_function: 
    RET 

HelloString db "Pell",0 

TIMES 510 - ($ - $$) db 0 
DW 0xAA55