当前位置: 代码迷 >> 汇编语言 >> 被一道MASM汇编题弄晕了,无奈向懂汇编的朋友
  详细解决方案

被一道MASM汇编题弄晕了,无奈向懂汇编的朋友

热度:9159   发布时间:2013-02-26 00:00:00.0
被一道MASM汇编题弄晕了,无奈向懂汇编的朋友求助
前天在做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 置零