用于打印helloworld的基本Bootloader程序无效

时间:2017-02-16 14:20:20

标签: assembly x86 cpu-registers bootloader

我正在尝试学习一个简单的helloworld引导程序。引用这个link。我使用nasm汇编程序成功生成了此汇编代码的二进制文件,并使用模拟器bochs运行,并且工作正常。 但是当我直接用硬盘做同样的事情时,我无法将字符串打印到屏幕上。

请在下面找到我使用的代码。

[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

1 个答案:

答案 0 :(得分: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