2016-11-28 6 views
1

J'utilise l'instruction 0xa à la fin d'une chaîne pour créer une nouvelle ligne afin que la dernière chaîne imprimée ne se déroule pas dans la suivante.Newline ne s'exécute pas correctement en utilisant nasm pour l'architecture x86

mov bx, MESSAGE 
call print_string 

mov bx, ANOTHER 
call print_string 

hlt 

print_string: 
    pusha 

    string_loop: 
     mov al, [bx] 
     cmp al, 0 
     jne print_char 

     popa 
     ret 

     print_char: 
      mov ah, 0x0e 
      int 0x10 
      add bx, 1 
    jmp string_loop 

;global vars 
MESSAGE: db 'Example string',0xa,0 
ANOTHER: db 'Another example string',0xa,0 

;padding/magic number 
times 510-($-$$) db 0 
dw 0xaa55 

Le seul problème est que, tandis que les cordes ne fait imprimer une ligne en dessous du dernier, la nouvelle ligne ne réinitialise pas la position de x à l'écran, donc au lieu d'imprimer directement sous la chaîne précédente, elle imprime ci-dessous et juste après la chaîne précédente.

exemple de sortie:

Example string 
       Another example string 

Comment puis-je écrire ce code afin que les chaînes imprimer directement sous la chaîne précédente?

+2

Vous devez ajouter un caractère 'CR' (0x0d). – Jester

+0

'0xa' n'est pas une instruction, c'est une donnée comme vous l'utilisez. Si vous avez essayé d'exécuter '0x0a' comme un octet de code machine, il serait [décoder comme' OU r8, \t r/m8'] (http://ref.x86asm.net/coder.html#x0A). –

+1

IMO cela fonctionne en quelque sorte par accident. Selon cette description de [int 10h, e] (http://stanislavs.org/helppc/int_10-e.html) les 'bh' et' bl' sont des arguments, mais vous utilisez 'bx' comme offset. Comme votre code est très court (fin de 'ANOTHER' <256), le' bh' est '0', et' bl' est de couleur uniquement en mode graphique, en mode texte, il est ignoré. Mais je ne recommanderais pas une telle astuce intelligente sans au moins commenter dans le code expliquant pourquoi cela fonctionne. – Ped7g

Répondre

1

Que faire avec le commentaire de Jester (ajouter un retour chariot à côté linefeed):

MESSAGE: db 'Example string',13,10,0 
ANOTHER: db 'Another example string',13,10,0 

Que faire avec le commentaire de Ped7g (changement BX dans SI et configurer les arguments BL et BH):

mov bx, 0007h  ;Display page 0, graphics color 7 
mov si, MESSAGE 
call print_string 
... 
string_loop: 
    mov al, [si] 
    ... 
    add si, 1 
    jmp string_loop 

Puisqu'il s'agit d'un code de bootloader (times 510-($-$$) db 0dw 0xaa55) a Etant donné que ORG 0 est la valeur par défaut, il vaut mieux définir explicitement le registre de segment DS à zéro. Ne faites pas confiance à votre environnement d'exécution pour cela!

xor  ax, ax 
mov  ds, ax 

Mettez cela avant toute autre chose.