2017-02-16 3 views
2

J'essaie d'apprendre un simple programme de bootloader helloworld. renvoyer cette link. J'ai réussi à générer le fichier binaire pour ce code d'assemblage en utilisant nasm assembleur et exécuter avec un émulateur bochs et cela fonctionne très bien. Mais quand j'ai fait la même chose directement avec un disque dur, je ne suis pas capable d'imprimer la chaîne à l'écran.Le programme Bootloader de base pour imprimer helloworld ne fonctionne pas

Veuillez trouver ci-dessous le code que j'ai utilisé.

[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

Comme d'habitude, vous avez oublié de 'intialize DS'. – Jester

+0

Pourriez-vous s'il vous plaît expliquer ce que fait cette DS.Je suis débutant dans l'assemblage. – skesh

+1

J'ai [Conseils Bootloader] (http://stackoverflow.com/a/32705076/3857942) dans une autre réponse SO. La configuration du registre de segment comme _DS_ peut être nécessaire. Quand vous dites disque dur voulez-vous dire que vous démarrez sur du matériel réel? –

Répondre

0

Vous devez initialiser les registres de segment avant de faire quoi que ce soit d'autre ou le programme va planter que vous ne pouvez pas accéder aux données.

[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