一个关于汇编求阶乘的问题!!

killyourdidi 2009-04-23 06:34:11
.386
DATAS SEGMENT USE16
BUF DB 10 DUP(0)
INPUT DB 'PLEASE INPUT X(0~9):$'
X DB ?
ERROR DB 0AH,0DH,'Input Error!',0AH,0DH,'$'
DATAS ENDS

STACKS SEGMENT USE16 STACK
DD 200 DUP(0)
STACKS ENDS

CODES SEGMENT USE16
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
MOV AX,DATAS
MOV DS,AX

MOV DX,OFFSET INPUT
MOV AH,9
INT 21H

MOV AH,1
INT 21H

CMP AL,'0'
JB ERR
CMP AL,'9'
JA ERR

CALL L1
CALL L2
MOV AH,4CH
INT 21H

L1 PROC
SUB AL,30H
MOV BL,AL
MOV EAX,1
A: MUL BX
DEC BX
CMP BX,1
JZ AA
JMP A
AA: RET
L1 ENDP
;求阶乘
L2 PROC
MOV CX,0
MOV EBX,10
LOP1:CWD
DIV EBX
PUSH EDX
INC CX
OR EAX,EAX
JNZ LOP1
LOP2:POP EDX
ADD DL,30H
MOV AH,2
INT 21H
DEC CX
JNE LOP2
RET
L2 ENDP
;输出


ERR: MOV DX,OFFSET ERROR
MOV AH,9
INT 21H

EXIT:MOV AH,4CH
INT 21H
CODES ENDS
END START
这是一个从键盘输入数字N(N为1~9之一),使用子程序求N! 并用子程序以十进制显示结果,程序如上,但是当输入8和9时,显示"DIVIDE ERROR',不知道是怎么回事,麻烦高手帮忙解答下!!谢谢
...全文
586 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
killyourdidi 2009-04-23
  • 打赏
  • 举报
回复
找到错误原因了, MUL BX-> MUL EBX
cnzdgs 2009-04-23
  • 打赏
  • 举报
回复
"DIVIDE ERROR"是除法溢出了,div ebx是用edx和eax组成的64位数除以ebx,应该在div之前用cdq或者xor edx,edx之类的指令来清除edx。
BAYNPU 2009-04-23
  • 打赏
  • 举报
回复
...
L2 PROC
MOV CX,0
MOV EBX,10
LOP1:;CWD;这条指令有错误
CDQ ;应该是把EAX符号扩展为EDX.EAX.

DIV EBX
PUSH EDX
INC CX
OR EAX,EAX
JNZ LOP1
LOP2:POP EDX
...
BAYNPU 2009-04-23
  • 打赏
  • 举报
回复
.386
DATAS SEGMENT USE16
BUF DB 10 DUP(0)
INPUT DB 'PLEASE INPUT X(0~9):$'
X DB ?
ERROR DB 0AH,0DH,'Input Error!',0AH,0DH,'$'
DATAS ENDS

STACKS SEGMENT USE16 STACK
DD 200 DUP(0)
STACKS ENDS

CODES SEGMENT USE16
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
MOV AX,DATAS
MOV DS,AX

MOV DX,OFFSET INPUT
MOV AH,9
INT 21H

MOV AH,1
INT 21H

CMP AL,'0'
JB ERR
CMP AL,'9'
JA ERR

CALL L1
CALL L2
MOV AH,4CH
INT 21H

L1 PROC
SUB AL,30H
MOV BL,AL
MOV EAX,1
A: MUL BX
DEC BX
CMP BX,1
JZ AA
JMP A
AA: RET
L1 ENDP
;求阶乘
L2 PROC
MOV CX,0
MOV EBX,10
LOP1:DIV EBX
CDQ;这条指令有错误
PUSH EDX
INC CX
OR EAX,EAX
JNZ LOP1
LOP2:POP EDX
ADD DL,30H
MOV AH,2
INT 21H
DEC CX
JNE LOP2
RET
L2 ENDP
;输出


ERR: MOV DX,OFFSET ERROR
MOV AH,9
INT 21H

EXIT:MOV AH,4CH
INT 21H
CODES ENDS
END START

21,500

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧