首页 > 解决方案 > 函数有一些问题

问题描述

嘿,伙计们,我正在尝试编写一个程序,该程序从用户那里获取 2 个数字,介于 1 和 2^32-1 之间,在取完这些数字之后,我检查它们是否是“友好数字”

https://www.merriam-webster.com/dictionary/amicable%20number

我的第二个函数出现错误,它检查 Num1 的除数之和,当我将数字 220 输入到 Num1 变量中时,由于某种原因在循环中循环了 59 次后,我得到“被零除”错误,我有不知道我做错了什么!

我添加了一个 SS 来显示错误发生的位置! 在此处输入图像描述

       .MODEL SMALL
            .STACK 100h
            .386
            .DATA
PromptStr DB 13,10,'Please enter 2 numbers!',13,10,'$'
Amicable DB 13,10,'Amicable Numbers',13,10,'$'
NotAmicable DB 13,10,'Not Amicable numbers',13,10,'$'
Cnt1 DD 0
Cnt2 DD 0
Num1 DD 0
Num2 DD 0
Ten DD 10
TMP DD 0
TMP1 DD 0
Key DW 221
Check DB 2
           .CODE
getNum PROC NEAR
       MOV AX,0
       MOV AH,1
       INT 21h
       MOV AH,0
       SUB AL,'0'
       MOV CX,Key
       CMP CX,AX
       JE EndgetNum
       MOV ECX,0
       MOV ECX,EAX
       MOV EAX,EBX
       MUL Ten
       ADD EAX,ECX
       MOV EBX,0
       MOV EBX,EAX
       MOV ECX,0
       MOV EAX,0
       JMP getNum
EndgetNum:
       MOV EAX,0
       MOV EAX,EBX
       RET
    getNum ENDP
PNum PROC NEAR
        MOV ECX,0
        MOV EDX,0
        MOV ECX,Num1
        MOV TMP,ECX
        MOV ECX,0
        MOV ECX,EAX
        DEC ECX
Cnt:
        MOV EAX,0
        MOV EAX,TMP
        MOV EBX,0
        MOV EBX,ECX
        DIV EBX
        MOV EBX,0
        CMP EBX,EDX
        JE ModIsZero
        LOOP Cnt
        MOV EAX,0
        MOV EAX,TMP1
        RET
        PNum ENDP

ModIsZero:
        ADD TMP1,ECX
        LOOP Cnt
ProgStart:
        MOV AX,@DATA
        MOV DS,EAX
        MOV DX,OFFSET PromptStr
        MOV AH,9
        INT 21h
        MOV EBX,0
        MOV EAX,0
        CALL getNum
        MOV Num1,EAX
        MOV EBX,0
        MOV EAX,0
        CALL getNum
        MOV Num2,EAX
        MOV EAX,0
        MOV EAX,Num1
        MOV EBX,0
        MOV EBX,2
        DIV EBX
        CALL PNum
        MOV AH,4Ch
        INT 21h
        END ProgStart

标签: assemblydosx86-16

解决方案


推荐阅读