2013-02-09 3 views
1

J'essaie de simuler la séquence de fibonacci jusqu'au nombre donné par l'utilisateur. J'ai obtenu ce code, mais il demande seulement une entrée à un chiffre de l'utilisateur. Et il accepte seulement de 3 à 9.Fibonacci: Language de l'assemblage

.MODEL SMALL 

.STACK 64 

.DATA 
     VAL1 DB  01H 
     VAL2 DB  01H 
     LP  DB  00H 
     V1  DB  00H 
     V2  DB  00H 
     NL  DB  0DH,0AH,'$' 

.CODE 

MAIN PROC 
     MOV AX,@DATA 
     MOV DS,AX 

     MOV AH,01H 
     INT 21H 
     MOV CL,AL 
     SUB CL,30H 
     SUB CL,2 

     MOV AH,02H 
     MOV DL,VAL1 
     ADD DL,30H 
     INT 21H 

     MOV AH,09H 
     LEA DX,NL 
     INT 21H 

     MOV AH,02H 
     MOV DL,VAL2 
     ADD DL,30H 
     INT 21H 

     MOV AH,09H 
     LEA DX,NL 
     INT 21H 


DISP: 
     MOV BL,VAL1 
     ADD BL,VAL2 

     MOV AH,00H 
     MOV AL,BL 
     MOV LP,CL 
     MOV CL,10 
     DIV CL 
     MOV CL,LP 

     MOV V1,AL 
     MOV V2,AH 

     MOV DL,V1 
     ADD DL,30H 
     MOV AH,02H 
     INT 21H 

     MOV DL,V2 
     ADD DL,30H 
     MOV AH,02H 
     INT 21H 

     MOV DL,VAL2 
     MOV VAL1,DL 
     MOV VAL2,BL 

     MOV AH,09H 
     LEA DX,NL 
     INT 21H 


     LOOP DISP 

     MOV AH,4CH 
     INT 21H 

MAIN ENDP 
END MAIN 

J'ai essayé de le modifier afin qu'il va accepter une entrée à deux chiffres, mais il écrasements. Voici le code modifié:

.MODEL SMALL 

.STACK 64 

.DATA 
Input db 13, 10, "Input the number of sequence: $" 
Output db 13, 10, "The sequence is $" 
     VAL1 DB  01H 
     VAL2 DB  01H 
     LP  DB  00H 
     V1  DB  00H 
     V2  DB  00H 
     NL  DB  ' $' 
     INP1A DB  ? 
     INP1B DB  ? 
     inputNum DB  ? 

.CODE 

MAIN PROC 
     MOV AX,@DATA 
     MOV DS,AX 

     ;display Input message 
     LEA DX, Input 
     MOV AH, 09h 
     INT 21h 

     ;gets the tens digit of sequence number 
     MOV AH,01h 
     INT 21h 
     SUB AL,'0' 
     MOV INP1B,AL 

     ; gets the ones digit of sequence number 
     MOV AH,01h 
     INT 21h 
     SUB AL,'0' 
     MOV INP1A,AL 

     ;makes the two digits of the sequence number a whole number 
     MOV AL, INP1B 
     MOV CH, 10 
     MUL CH 
     MOV BL, INP1A 
     ADD BL, AL 
     MOV inputNum, BL 
     ADD inputNum, '0' 

     ;input --> CL 
     MOV CL, inputNum 
     SUB CL,30H 
     SUB CL,2 

     ;display Output message 
     LEA DX, Output 
     MOV AH, 09H 
     INT 21H 

     ;display first Fib number : 1 
     MOV AH,02H 
     MOV DL,VAL1 
     ADD DL,30H 
     INT 21H 

     ;display space 
     MOV AH,09H 
     LEA DX,NL 
     INT 21H 

     ;display second Fib number : 1 
     MOV AH,02H 
     MOV DL,VAL2 
     ADD DL,30H 
     INT 21H 

     ;display space 
     MOV AH,09H 
     LEA DX,NL 
     INT 21H 


DISP: 
     ;adds the two previous numbers 
     MOV BL,VAL1 
     ADD BL,VAL2  ; new added number 


     MOV AH,00H 
     MOV AL,BL  ; new number ---> AL 

     MOV CL,10 
     MOV LP,CL  ; LP will have value of CL (inputNumber) 
     DIV CL 
     MOV CL,LP 

     MOV V1,AL  ; V1 = new number (added) 
     MOV V2,AH  ; V2 = null 

     MOV DL,V1  ; DL = new number 
     ADD DL,30H ; DL -> string 
     MOV AH,02H  ; print value of V1 
     INT 21H 

     MOV DL,V2  ; DL = V2 (null) 
     ADD DL,30H  ; DL -> string 
     MOV AH,02H  ; print value of V2 
     INT 21H 

     MOV DL,VAL2  ; DL = new added number 
     MOV VAL1,DL  ; VAL1 = DL = new added number 
     MOV VAL2,BL  ; VAL2 = new added number = VAL2 

     ; display space 
     MOV AH,09H 
     LEA DX,NL 
     INT 21H 

     LOOP DISP 

     MOV AH,4CH 
     INT 21H 

MAIN ENDP 
END MAIN 

Y at-il une solution pour que cela fonctionne? Merci d'avance!

+0

Ceci est un code MS-DOS. La valeur actuelle de ceci est discutable, au mieux. Je vous recommande d'obtenir une copie de MASM32 et d'apprendre quelques assemblages Win32. – raven

+0

Quoi qu'il en soit, un indice sur l'endroit où il plante? – raven

Répondre

0

Il se trouve un problème:

;makes the two digits of the sequence number a whole number 
MOV AL, INP1B 
MOV CH, 10 
MUL CH 
MOV BL, INP1A 
ADD BL, AL 
MOV inputNum, BL 
ADD inputNum, '0' 

La Ajouter '0' est utilisé pour convertir un chiffre hexadécimal à sa représentation ASCII ('0' est 0x30, '1' est 0x31, etc.). Si vous avez deux chiffres, ce serait un nombre compris entre 0 et 99. S'il est supérieur à 10, l'ajout de '0' donne une valeur incorrecte. Cependant, cela ne devrait pas faire planter votre programme.