前天在做PC技术练习时遇到这样一道汇编题目,要求在下面已给出开头和结尾的程序中补写一段程序(MASM环境下),最终输出1~100中的除1外的所有素数(或者说是前100个正整数中的所有质数)到目标文件‘output1.dat'中,于是我按要求对程序主体部分(begin行和end行中间部分)进行了编写,修改后整个程序如下:
EXTRN SAVE:FAR
N EQU 100
DATA SEGMENT
RESULT DW N DUP(0)
NAME1 DB 'OUTPUT1.DAT',0
DATA ENDS
SSTACK SEGMENT STACK
DB 256 DUP(?)
SSTACK ENDS
CODE SEGMENT
ASSUME CS:CODE,SS:SSTACK,DS:DATA
MAIN PROC FAR
PUSH DS
MOV AX,0
PUSH AX
MOV AX,DATA
MOV DS,AX
;****BEGIN****
LEA DI,RESULT
MOV BX,N-1
MOV SI,2
MOV CX,0
PR0: PUSH BX
MOV DL,1
FINDEND:MOV AL,DL
MUL DL
CMP AX,SI
JA NEXT
INC DL
JMP FINDEND
NEXT: SUB DL,2
JZ STORE
MOV BX,2
MOV CL,DL
PR1: MOV AX,SI
DIV BX
SENTEN: CMP DX,0
JE CONT_
INC BX
DEC CL
JNZ PR1
STORE: MOV [DI],SI
ADD DI,2
CONT_: INC SI
POP BX
DEC BX
JNZ PR0
MOV CX,DI
;*****END****
MOV DX,OFFSET RESULT
MOV SI,OFFSET NAME1
CALL FAR PTR SAVE
RET
MAIN ENDP
CODE ENDS
END MAIN
汇编后运行结果如图所示
检查了好几遍都发现不了错误所在,不知运行后为什么会出现除法溢出的错误,非常不解。
请高手指点!
------解决方案--------------------------------------------------------
- Assembly code
MOV CL,DLPR1: MOV AX,SI DIV BX ; 那就是这里?DX:AX/BX 前面使用过 DX 但这里却没有将 DX 清零,所以有可能就溢出了SENTEN: CMP DX,0 JE CONT_
------解决方案--------------------------------------------------------
xor dx,dx
道理楼上讲了
------解决方案--------------------------------------------------------
div bx 指令不是 AX/BX 而是 DX:AX/BX ,所以如果只是需要 AX/BX 的话,div 指令前必须将 DX 置零