Si vous avez besoin d'accepter des nombres avec plus d'un chiffre que vous devez exécuter deux étapes:
- Encaisser le numéro sous forme de chaîne, non pas comme les caractères individuels.
- Convertissez la chaîne en nombre avec une procédure.
Voici comment vous acceptez une chaîne:
mov ah, 0ah
mov dx, the_string
int 21h
La the_string
variables ont besoin de ce format spécifique:
the_string db 26 ;MAX NUMBER OF CHARACTERS ALLOWED (25).
db ? ;LENGTH (NUMBER OF CHARACTERS ENTERED BY USER).
db 26 dup (?) ;CHARACTERS ENTERED BY USER (END WITH 0AH).
Remarquez les trois sections: le premier octet indique le nombre maximum de caractères autorisé (plus un en raison de la touche ENTRÉE à la fin), le deuxième octet va stocker la longueur de la chaîne entrée, la troisième section est le tableau de caractères (terminée par ENTRÉE clé = '0ah'). Une fois que vous avez accepté la chaîne, il est nécessaire de la convertir en un nombre avec un algorithme connu: traitez les caractères de droite à gauche en multipliant chacun par une puissance de 10. Nous appellerons cette procédure "numéro2 chaîne".
La procédure "string2number" prend un paramètre: registre SI
pointant vers la variable chaîne (celle avec les trois sections). Le numéro est retourné dans le registre BX
. Si le nombre est petit, il peut entrer dans BL
. Cette procédure vous sera très utile dans vos futurs programmes.
suivant est votre code avec les modifications et la procédure « string2number » à la fin:
.model small
.stack 100h
.data
str db 4 ;MAX NUMBER OF CHARACTERS ALLOWED (3).
db ? ;LENGTH (NUMBER OF CHARACTERS ENTERED BY USER).
db 4 dup (?) ;CHARACTERS ENTERED BY USER (END WITH 0AH).
ctr db 0
.code
mov ax, @data
mov ds, ax
; mov ah,01h
; int 21h
mov ah, 0ah ;◄■ CAPTURE STRING FROM KEYBOARD.
mov dx, offset str ;◄■ VARIABLE TO STORE THE STRING.
int 21h
mov si, offset str ;◄■ STRING TO CONVERT INTO NUMBER.
call string2number ;◄■ NUMBER WILL RETURN IN BX.
mov al, bl ;◄■ COPY NUMBER INTO AL.
delay:
mov ctr,'0'
mov al,bl
mov cx,100
skip:
x:
mov al,00000000b
mov dx,378h
out dx,al
loop x
Z: mov al,bl
mov dx,378h
out dx,al
loop z
inc ctr
Cmp ctr,'8'
Je exit
jmp skip
Exit :
Mov ah,4ch
int 21h
; End start
;▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼
;CONVERT STRING TO NUMBER IN BX.
;SI MUST ENTER POINTING TO THE STRING.
proc string2number
;MAKE SI TO POINT TO THE LEAST SIGNIFICANT DIGIT.
inc si ;POINTS TO THE NUMBER OF CHARACTERS ENTERED.
mov cl, [ si ] ;NUMBER OF CHARACTERS ENTERED.
mov ch, 0 ;CLEAR CH, NOW CX==CL.
add si, cx ;NOW SI POINTS TO LEAST SIGNIFICANT DIGIT.
;CONVERT STRING.
mov bx, 0
mov bp, 1 ;MULTIPLE OF 10 TO MULTIPLY EVERY DIGIT.
repeat:
;CONVERT CHARACTER.
mov al, [ si ] ;CHARACTER TO PROCESS.
sub al, 48 ;CONVERT ASCII CHARACTER TO DIGIT.
mov ah, 0 ;CLEAR AH, NOW AX==AL.
mul bp ;AX*BP = DX:AX.
add bx,ax ;ADD RESULT TO BX.
;INCREASE MULTIPLE OF 10 (1, 10, 100...).
mov ax, bp
mov bp, 10
mul bp ;AX*10 = DX:AX.
mov bp, ax ;NEW MULTIPLE OF 10.
;CHECK IF WE HAVE FINISHED.
dec si ;NEXT DIGIT TO PROCESS.
loop repeat ;COUNTER CX-1, IF NOT ZERO, REPEAT.
ret
endp
Oui, je veux avoir un retard en mesure de voir ce qui est arrivé à traiter sur l'interface du port parallèle si i Mec utilisé, comme 100 –
Mec, ma réponse te laisse entrer le nombre comme tu le veux. Copiez-collez mon code dans votre compilateur et testez-le. –