2017-02-16 28 views
2

Я пытаюсь изучить простую программу загрузчика helloworld. ссылаясь на это link. Я успешно сгенерировал двоичный файл для этого кода сборки, используя ассемблер nasm и запускаю с эмулятором bochs, и он отлично работает. Но когда я сделал то же самое непосредственно с жестким диском, я не смог напечатать строку на экране.Программа Basic Bootloader для печати 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

У меня есть [Советы загрузчика] (http://stackoverflow.com/a/32705076/3857942) в другом ответе SO. Возможно, потребуется настроить регистр сегмента, например _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