主题:汇编程序,在命令行里有错,用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
程序是做零的阶乘
;----------------------数据段定义---------------
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