assembly 显示数字阶乘的汇编语言程序不工作

j8ag8udp  于 2023-02-04  发布在  其他
关注(0)|答案(1)|浏览(129)

使用汇编语言和DOSBox显示阶乘数。
我的代码的结果是:
输入编号:5
阶乘为5

Title this program display the factorial of a number
dosseg
.model small
.stack 0100H
.data 
    num db 10,13, 'Enter number: $'
    ans db 10,13, 'The factorial is $'

.code

    ;clear screen
    mov ax, 03H
    int 10H

    mov ax, @data
    mov ds, ax

    lea dx,num
    mov ah, 09
    int 21H

    mov ah, 1
    int 21H
    mov bl,al

    sub bl,1

    fac:
    mul bl    ;al = al*bl
    sub bl,1
    
    loop fac

    lea dx,ans
    mov ah, 09
    int 21H

    mov ah, 02
    mov dl, bl
    int 21H

    mov ah, 4ch
    int 21H
    int 20H

end
zsbz8rwp

zsbz8rwp1#

计算5!得到120,所以为了显示结果,不能只使用DOS中的单字输出函数02 h。阅读Displaying numbers with DOS,学习如何显示多位数

mov ah, 1
 int 21H
 mov bl,al
 sub bl,1
fac:
 mul bl    ;al = al*bl
 sub bl,1
 loop fac
  • 当您用5响应DOS.Getcharacter函数01 h时,您将收到该数字的ASCII代码53。在开始计算之前,您需要转换该数字。对于十进制数字,只需减去48:也可以写成sub al, '0'
  • loop指令依赖于CX寄存器,而您忘记了初始化它!现在不必麻烦了,因为没有loop指令代码也能正常工作。只要BL变为1就退出循环。您不想乘以1,因为那是浪费时间。

最多5个!

使用byte大小乘法的代码可以处理最多5!的阶乘(对于6!及以上,乘积将溢出AL寄存器):

mov  ah, 01h
 int  21h       ; -> AL=["1","5"]
 sub  al, '0'
 cbw            ; -> AX is [1,5]
 cmp  al, 3
 jb   done
 mov  bl, al    ; [3,5]
fac:
 dec  bl
 mul  bl
 cmp  bl, 2
 ja   fac
done:
 ...

在...中,您将编写显示AX中的编号的代码,并且可以从Displaying numbers with DOS复制该代码。

6!及以上

因为9!是362880,所以您需要使用word大小的乘法,并且为了避免任何溢出,您应该从2开始乘法,直到输入的数字。
在这里,您将显示DX:AX中的数字。也可以在Displaying numbers with DOS中找到。

相关问题