+ -
当前位置:首页 → 问答吧 → Y=A*B+C/D-E,结果是溢出,请教高手帮忙看一下,修改下。

Y=A*B+C/D-E,结果是溢出,请教高手帮忙看一下,修改下。

时间:2011-06-16

来源:互联网

.分析问题
1.已知条件:Y=A*B+C/D-E,其中A、B、C、D、E均为字节数,并由键盘输入。
2.目的要求:按式计算Yi,正负数分别存贮并将结果显示在屏幕上。
源程序是:
STACK SEGMENT STACK
  DW 256 dup(0)
STACK ENDS
DATA SEGMENT
STRING0 DB 0AH,0DH,'Do you want to input data?(Y/N)','$'
STRING3 DB 0AH,0DH,'Please input your data.','$'
STRING1 DB 0AH,0DH,'A=','$'
  DB 0AH,0DH,'B=','$'
  DB 0AH,0DH,'C=','$'
  DB 0AH,0DH,'D=','$'
  DB 0AH,0DH,'E=','$'
STRING2 DB 0AH,0DH,'Y1=A*B+C/D-E=','$'
BUF1 DB 10,0,8 DUP(0)
BUF2 DB 10,0,8 DUP(0)
BUF3 DB 10,0,8 DUP(0)
BUF4 DB 10,0,8 DUP(0)
BUF5 DB 10,0,8 DUP(0)
BUFR DW 10 DUP(0)
DATA1 DW 5 DUP(0)
DATA2 DW 5 DUP(0)
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE, DS:DATA,SS:STACK
START PROC FAR  
BEGIN: PUSH DS  
MOV AX,0
  PUSH AX
  MOV AX,DATA
  MOV DS,AX
A2: LEA DX,STRING0
  MOV AH,09H
  INT 21H
  MOV AH,01
  INT 21H
  CMP AL,'Y'
  JNE DONE
  LEA DX,STRING3
  MOV AH,09H
  INT 21H
MOV CX,5 
  LEA BX,STRING1
  LEA DI,BUF1
A0: MOV DX,BX
  MOV AH,09H
  INT 21H
MOV AH,0AH
  MOV DX,DI
  INT 21H
  ADD BX,5
  ADD DI,10
  LOOP A0
MOV CX,5
  LEA SI,BUF1
  LEA DI,BUFR
A1: CALL INZH  
  ADD SI,10
  ADD DI,2
  LOOP A1
  LEA DI,BUFR
  LEA SI,DATA1
  CALL JIS  
JMP A2
DONE: MOV AH,4CH
  INT 21H
  RET
   




INZH PROC NEAR
PUSH SI  
PUSH DX  
PUSH CX  
PUSH AX
MOV DX,0 
MOV CX,0
MOV AX,0  
MOV CL,[SI+1]
ZH0: MOV AL,[SI+2]  
  INC SI
  SUB AL,30H
  PUSH CX
  PUSH AX
  MOV AX,DX
MOV CL,10
MUL CL  
MOV DX,AX
POP AX
  ADD DX,AX
  POP CX
LOOP ZH0
MOV [DI],DX
POP AX
  POP CX
  POP DX
  POP SI
  RET
INZH ENDP

JIS PROC NEAR 
  PUSH DI  
  PUSH SI  
  PUSH AX
  PUSH BX
  PUSH DX
MOV AX,[DI] 
  MOV BX,[DI+2] 
  MUL BX 
  MOV [SI],AX 
MOV DX,0
  MOV AX,[DI+4] 
  MOV BX,[DI+6] 
  DIV BX 
  ADD [SI],AX 
  MOV BX,[DI+8] 
  MOV STRING3+13, '= ' 
  MOV AX,[SI] 
  SUB AX,BX 
  JL JIS1 
  MOV [SI],AX 
  MOV STRING3+14, ' ' 
  CALL OUTZH 
  JMP JIS2 
JIS1: MOV DATA2,AX 
  NEG AX 
  MOV STRING3+14, '- ' 
  CALL OUTZH 
JIS2: POP DX 
POP BX 
POP AX 
POP SI 
POP DI 
  RET 
JIS ENDP
OUTZH PROC NEAR

  PUSH DX
  PUSH CX
  PUSH BX
  PUSH SI
  MOV CX,5
  LEA SI , STRING2
  ADD SI, 20
  MOV DX,0
  MOV BX,10
OUTZH1: DIV BX  
  XCHG AX,DX  
  ADD AL,30H  
  MOV [SI],AL  
  DEC SI  
  MOV AX,DX
  LOOP OUTZH1
  MOV STRING2+21,'$'

  MOV AH,09H
  LEA DX,STRING2
  INT 21H

  POP SI
  POP BX
  POP CX
  POP DX
  RET
OUTZH ENDP
CODE ENDS
  END START


可能是除法需要CBW扩充为字。还有可能错误的地方是OUTZH1这里。谢谢了。

作者: yun520yu   发布时间: 2011-06-16

要改那里呢

作者: MSOKD   发布时间: 2011-06-16