首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Fibonacci :汇编语言

Fibonacci :汇编语言
EN

Stack Overflow用户
提问于 2013-02-09 23:47:21
回答 1查看 3K关注 0票数 1

我正在尝试模拟斐波那契数列,直到用户给出的数字。我得到了这个代码,但它只要求用户输入一位数。并且它只接受从3到9的输入。

代码语言:javascript
复制
.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

我试图修改它,使其能够接受两位数的输入,但它崩溃了。以下是修改后的代码:

代码语言:javascript
复制
.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

有什么解决方案可以解决这个问题吗?提前感谢!

EN

回答 1

Stack Overflow用户

发布于 2013-02-10 04:19:55

有一个问题:

代码语言:javascript
复制
;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'

Add '0‘用于将十六进制数字转换为其ASCII表示形式('0’是0x30,'1‘是0x31,依此类推)。如果你有两位数,那将是一个介于0和99之间的数字。如果它大于10,则添加'0‘会得到一个不正确的值。然而,这不应该使您的程序崩溃。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14789763

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档