assembly - 函数有一些问题
问题描述
嘿,伙计们,我正在尝试编写一个程序,该程序从用户那里获取 2 个数字,介于 1 和 2^32-1 之间,在取完这些数字之后,我检查它们是否是“友好数字”
https://www.merriam-webster.com/dictionary/amicable%20number
我的第二个函数出现错误,它检查 Num1 的除数之和,当我将数字 220 输入到 Num1 变量中时,由于某种原因在循环中循环了 59 次后,我得到“被零除”错误,我有不知道我做错了什么!
.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
解决方案
推荐阅读
- c# - 来自上下文的 Hangfire ServerName
- javascript - 如何在同一字段中同时验证电子邮件和电话?
- r - 如何在R中将日期格式从yyyy-m-dd(1990-1-01)转换为yyyy-mm-dd(1990-01-01)?
- postman - 如何在 Postman 脚本中获取当前年份
- c - 从文件中找出哪一行的元音最多
- c# - 来自 XML 文档的 Asp.net 核心 GraphQL
- objective-c - 验证目录是否为捆绑包
- java - 迭代多个 CSV 并加入 Spark SQL
- delphi - AutoCAD 类型库在 Windows 10 中不起作用
- firebase - ios上没有recaptcha的离子firebase phoneAuth