La solution appropriée et générique à votre problème est de convertir les nombres en chaînes. Pour vous montrer comment faire j'ai fait venir des modifications à votre code:
- Changé le type de
NUM
, DB
-DW
(requis par number2string
, il détiendrait plus grand nombre).
- Ajout de la variable
numstr
, qui est NUM
convertie en chaîne.
- Ajout de la variable
lbk
(juste un saut de ligne après chaque numéro).
- Ajouté proc
number2string
, pour convertir un nombre dans AX à la chaîne pointée par SI (c'est le plus important).
- Ajouté proc
dollars
, pour remplir numstr
avec des signes dollar (nécessaire pour afficher, et pour effacer la chaîne avant de convertir le nombre suivant).
Voici votre code affichage des nombres de 0 à 100 (les commentaires vous aideront à comprendre):
.MODEL SMALL
.STACK 100H
.DATA
NUM DW ?
lbk db 13,10,'$' ;LINE BREAK.
numstr db '$$$$$' ;STRING FOR 4 DIGITS.
.CODE
MAIN PROC
MOV AX,@DATA
MOV DS,AX
MOV NUM, 0 ;FIRST NUMBER.
START:
CMP NUM, 100 ;IF NUM <= 100...
JBE PRINT ;...DISPLAY NUM.
JMP END_
PRINT:
; MOV AH,2 ;THIS CODE
; MOV DL,NUM ;DISPLAYS
; INT 21H ;ONE CHAR ONLY.
;CONVERT NUMBER TO STRING.
mov si, offset numstr
mov ax, num
call number2string ;RETURNS NUMSTR.
;DISPLAY STRING.
mov ah, 9
mov dx, offset numstr
int 21h
;DISPLAY LINE BREAK.
mov ah, 9
mov dx, offset lbk
int 21h
INC NUM ;NUM++.
JMP START
END_:
MOV Ax,4C00H
int 21h
MAIN ENDP
;------------------------------------------
;CONVERT A NUMBER IN STRING.
;ALGORITHM : EXTRACT DIGITS ONE BY ONE, STORE
;THEM IN STACK, THEN EXTRACT THEM IN REVERSE
;ORDER TO CONSTRUCT STRING (STR).
;PARAMETERS : AX = NUMBER TO CONVERT.
; SI = POINTING WHERE TO STORE STRING.
number2string proc
call dollars ;FILL STRING WITH $.
mov bx, 10 ;DIGITS ARE EXTRACTED DIVIDING BY 10.
mov cx, 0 ;COUNTER FOR EXTRACTED DIGITS.
cycle1:
mov dx, 0 ;NECESSARY TO DIVIDE BY BX.
div bx ;DX:AX/10 = AX:QUOTIENT DX:REMAINDER.
push dx ;PRESERVE DIGIT EXTRACTED FOR LATER.
inc cx ;INCREASE COUNTER FOR EVERY DIGIT EXTRACTED.
cmp ax, 0 ;IF NUMBER IS
jne cycle1 ;NOT ZERO, LOOP.
;NOW RETRIEVE PUSHED DIGITS.
cycle2:
pop dx
add dl, 48 ;CONVERT DIGIT TO CHARACTER.
mov [ si ], dl
inc si
loop cycle2
ret
number2string endp
;------------------------------------------
;FILLS VARIABLE WITH '$'.
;USED BEFORE CONVERT NUMBERS TO STRING, BECAUSE
;THE STRING WILL BE DISPLAYED.
;PARAMETER : SI = POINTING TO STRING TO FILL.
proc dollars
mov cx, 5
mov di, offset numstr
dollars_loop:
mov bl, '$'
mov [ di ], bl
inc di
loop dollars_loop
ret
endp
;------------------------------------------
END MAIN
A partir de maintenant, vous pouvez utiliser number2string
et dollars
pour afficher les nombres.
Copie possible de http://stackoverflow.com/questions/15621258/assembly-printing-ascii-number – DAXaholic
Fondamentalement, vous devez effectuer manuellement la conversion binaire en décimal. C'est ce que 'printf' faisait toujours dans les coulisses, mais maintenant ce n'est pas là pour vous aider. Mieux vaut commencer à lire sur 'DIV'. Vous pouvez également créer des boucles imbriquées pour imprimer les unités et les chiffres 10s. –
Il imprime le caractère ASCII avec la valeur 58, qui est ":". Il n'imprime aucune valeur '10d', ce serait le" nouveau saut de ligne "en ASCII. Les 9 à 0 n'impriment pas les valeurs 0-9, mais 48-57. Quels sont les chiffres '0' à '9' en codage ASCII. Donc, si vous voulez faire 100 à 0, vous devez soit faire un algorithme de travail avec 1 à 3 valeurs de caractères ASCII (48-57), ou faire le comptage réel sous forme entière (de 100 à 0), et convertir ce nombre en 1 à 3 caractères ASCII (48-57) selon les besoins. Comme d'autres commentaires le disent. (Je viens d'ajouter ceci parce que vous dites "valeur du caractère ascii de 10d" = nope) – Ped7g