2016-09-02 1 views
0

Comment accepter une entrée avec un grand nombre comparer ensuite par exemplecomment accepter l'entrée d'un grand nombre (plusieurs chiffres)

mov ah,01h 
int 21h 

je veux accepter plus d'un caractère et déplacer ce nombre à al pour accéder au port de clignoter une lED par entrée de l'exemple d'utilisateur que l'utilisateur veut taper 32 mais le caractère unique était

mov bl,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 
+0

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 –

+0

Mec, ma réponse te laisse entrer le nombre comme tu le veux. Copiez-collez mon code dans votre compilateur et testez-le. –

Répondre

0

pour entrer un numéro à 2 chiffres que vous répétez simplement l'entrée pour 1 caractère 2 fois et combiner les résultats:

mov ah, 01h 
int 21h 
sub al, '0' 
mov bl, al  ;1st digits "tens" 
mov ah, 01h 
int 21h 
sub al, '0' ;2nd digit "units" 
xchg al, bl 
mov ah, 10 
mul ah 
add al,bl 

Ici AL tiendra votre numéro 32 si la première entrée était le caractère "3" et la deuxième entrée le caractère "2".


Sans réinitialisant le registre CX, votre boucle Z itérera 65536 fois parce qu'à la fin de la boucle X le registre CX sera de 0! Est-ce intentionnel?

+0

Je veux avoir l'entrée de l'utilisateur je veux l'obtenir comme un nombre puis l'utiliser comme une valeur de registre afin que le programme l'obtienne puis l'utiliser pour sortir l'adresse des lumières du port parallèle –

1

Si vous avez besoin d'accepter des nombres avec plus d'un chiffre que vous devez exécuter deux étapes:

  1. Encaisser le numéro sous forme de chaîne, non pas comme les caractères individuels.
  2. 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