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?
Vous devez ajouter un caractère 'CR' (0x0d). – Jester
'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). –
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