回 帖 发 新 帖 刷新版面

主题:汇编程序,在命令行里有错,用debug运行却正常,为什么?

我写的汇编程序,在命令行里显divide overflow,用debug运行却正常,为什么?
程序是做零的阶乘
;----------------------数据段定义---------------
DATA  SEGMENT
RDEC  DB ' RUSULT IS:$'
REDEC  DB 11 DUP(?)
RERROR DB ' WRONG INPUT!$'
DATA   ENDS   
;----------------------堆栈段定义---------------
STACK  SEGMENT PARA STACK 'STACK'
   DB 50 DUP(?)
STACK  ENDS
;---------------------程序段定义----------------
CODE  SEGMENT 
   ASSUME CS:CODE,DS:DATA,SS:STACK
MAIN:  MOV AX,DATA
   MOV DS,AX
   MOV AH,1     ;获取输入
   ;INT 21H
   MOV AH,0     ;清除AH
   MOV AL,'0'      ;-----------------
   CMP AX,30H     ;判断是否是合法输入
   JS  ERROR
   CMP AX,3AH
   JNS ERROR
   SUB AX,30H    ;变为数字
   CALL FACT
   MOV DI,OFFSET REDEC
   ADD DI,10
   
   MOV BYTE PTR[DI],'$'
   DEC DI 
   MOV AX,BX
   MOV CX,10
TRAN:  DIV CX
;   PUSH AX  
;   MOV AH,1     ;获取输入
;   INT 21H
;   POP AX
   CMP AX,0
   JNE AXNZ
   CMP DX,0
   JE TRANOK
   MOV BYTE PTR[DI],DL
   DEC DI
   JMP TRANOK
AXNZ:  MOV BYTE PTR[DI],DL
   DEC DI
   MOV DX,0
   JMP TRAN
TRANOK: MOV SI,OFFSET REDEC
   MOV DI,OFFSET REDEC
SEARCH: CMP BYTE PTR[SI],0
   JE INCSI
   JMP MOVEDT
INCSI: INC SI
   JMP SEARCH
MOVEDT: MOV BL,BYTE PTR[SI]
   ADD BL,30H
   MOV BYTE PTR[DI],BL
   INC DI
   INC SI
   CMP BYTE PTR[SI],'$'
   JNE MOVEDT
   MOV BYTE PTR[DI],'$'
   MOV DX,OFFSET REDEC
   MOV AH,9
   INT 21H
   MOV AH,4CH
   INT 21H
ERROR: MOV DX,OFFSET RERROR
   MOV AH,9
   INT 21H
   MOV AH,4CH
   INT 21H
;-------------------------------------
FACT  PROC
   CMP AX,0
   JNE IIA
   MOV BX,1
   RET
IIA:  PUSH AX
   DEC AX
   CALL FACT
X2:  POP CX
   CALL MULT
X3:  MOV BX,AX
   RET
FACT  ENDP
;-------------------------------------
MULT  PROC
   MOV AX,BX
   MUL CX
   RET
MULT  ENDP
CODE  ENDS
   END MAIN

回复列表 (共1个回复)

沙发

TRAN:  DIV CX
------------------
这一句产生除法溢出,引起零号中断调用。

原因是商大于16位,这种情况下,你得把除法提升到除数为32位的除法,以避免除法溢出。在16位cpu下,32位除法得自己设计算法,或者使用.386的16位指令,利用.386提供的32位除法计算。在dos下可以使用32位寄存器的,只要是16位指令就OK,不能用32位指令。

我来回复

您尚未登录,请登录后再回复。点此登录或注册