2017-05-31 8 views
1

Je veux imprimer la longueur de la chaîne 'Hello World', en obtenant la valeur (0Bh qui est 11, mais l'interruption imprime le caractère ascii qui est ♂ et non 11)emu8086 - Comment obtenir CHAR à partir du code ASCII

org 100h 

LEA SI, msg 
MOV CL, 0 

CALL printo 


printo PROC 
next_char: 

    CMP b.[SI],0 
    JE stop 

    MOV AL,[SI] 

    MOV AH, 0Eh 
    INT 10h 

    INC SI 
    INC CL 

    JMP next_char 

printo ENDP 

stop: 

MOV AL,CL ; CL is 0B (11 characters from 'Hello World') 
MOV AH, 0Eh 
INT 10h ; but it's printing a symbol which has a ascii code of 0B 

ret 

msg db 'Hello World',0 
END 
+0

Donc votre question est de savoir comment convertir l'entier '11' à la chaîne' "11" '? –

+0

@Someprogrammerdude La chose est que je ne reçois pas INTEGER 11 mais ASCII 0Bh. Il est en train d'imprimer le symbole '♂' qui est le 11ème symbole dans la table ASCII – concretejungle

+0

La longueur de la chaîne '" Hello world "' est * onze * caractères (octets). "11" en décimal est "0b" en hexadécimal, c'est pareil. Ce que vous devez faire est de convertir la valeur entière '11' en une * chaîne * (c'est-à-dire le caractère' '1'' deux fois) puis imprimer la chaîne. Ou si vous êtes catégorique, il doit être imprimé en hexadécimal (pourquoi?), Puis convertir le nombre '11' à la chaîne' "0b" ', puis imprimer cette chaîne. La partie importante est la conversion en chaîne, maintenant vous devez décider si vous voulez que la chaîne contienne le nombre décimal ou hexadécimal. De toute façon, les deux ont beaucoup d'exemples si vous cherchez juste un peu. –

Répondre

3
MOV AL,CL ; CL is 0B (11 characters from 'Hello World') 

Avec la longueur en AL il est facile de le représenter en notation décimale.
L'instruction AAM va d'abord diviser le registre AL par 10, puis laisser le quotient dans AH et le reste dans AL.
S'il vous plaît prendre note que cette solution fonctionne pour toutes les longueurs de 0 à 99.

aam 
add ax, "00" ;Turn into text characters 
push ax 
mov al, ah 
mov ah, 0Eh ;Display tenths 
int 10h 
pop ax 
mov ah, 0Eh ;Display units 
int 10h 

Dans le cas où le nombre impliqué est inférieur à 10, il serait laid d'avoir fait un zéro affiché devant la numéro à un chiffre. Ensuite, ajoutez juste le suivant au code:

aam 
add ax, "00" ;Turn into text characters 
cmp ah, "0" 
je Skip 
push ax 
mov al, ah 
mov ah, 0Eh ;Display tenths 
int 10h 
pop ax 
Skip: 
mov ah, 0Eh ;Display units 
int 10h 
+1

Joli usage des instructions BCD ('aa *') que je n'ai jamais vraiment pris la peine d'apprendre :) –