2017-02-16 64 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