回 帖 发 新 帖 刷新版面

主题:请大虾们帮忙改一下这个计算器程序啊~~急用~~

下面的程序是从网上搜到的一个关于计算器的代码,小女子是个电脑白痴啊,尤其是编程,要交作业啦~~所以想请大虾们帮忙改一下啊~~
[color=FF0000]把每一个操作数的数字范围改在-128~127之间,还有那除法运算中, 结果显示为:商...余数的形式..[/color]...
先谢过啦~~


STACK  SEGMENT  STACK
   DB   200 DUP(0)
STACK  ENDS
DATA SEGMENT
   OPS    DB ?
   OPD    DB ?
   OPER   DB ?
   Tsave  DB ?
   TIT   DB' _________________________________ ',0DH,0AH
         DB'|_____________Welcome!____________|',0DH,0AH  
DB'|          + - *  /                 |' ,0DH,0AH  
         DB'|          Y,y:continue             |' ,0DH,0AH
         DB'|          N,n:  quit              |' ,0DH,0AH
         DB'|_________________________________|' ,0DH,0AH
        DB'|____________Calculate______________|$',0DH,0AH
   Tip1    DB 'Input the first  operator (0---9):$',0DH,0AH
   Tip2    DB 'Please input the oper (+,- ,*,/) :$',0DH,0AH
   Error   DB 'Error! Plese input the oper again:$',0DH,0AH
   Tip3    DB 'Input the second operator (0---9):$',0DH,0AH
   Result  DB '--------------->the   result   is:$',0DH,0AH    
   Quit    DB 'Choose repeat or quit? (Y/y/N/n) :$',0DH,0AH
DATA   ENDS
CODE SEGMENT
   ASSUME  CS: CODE,DS:DATA,SS:STACK
START:           
     MOV   AX,DATA               ;初始化 DS:DX
     MOV   DS,AX
Remain:  
     MOV   BL,0                    ;Oper(恢复)初始状态
     MOV   OPS,BL
     MOV   OPER,BL
     MOV   OPD,BL
     LEA   SI,OPS                   ;OPS的偏移地址送给SI
     LEA   DI,OPD                  ;OPD的偏移地址送给DI
     CALL  Enter
     LEA   DX,TIT                     
     MOV   AH,9  
     INT   21H 
     CALL  Input1             ;调用输入第一个操作数                    
     CALL  Operat             ;调用输入操作符
     CALL  Input2             ;调用输入第二个操作数
     CALL  Calculate           ;调用计算方法
     CALL  StrQuit             ;调用判断程序再次执行
     MOV   AH,1
     INT   21H
     CMP   AL,'Y'
     JE    Remain 
     CMP   AL,'y'             ;选择Y返回Remain继续执行
     JE    Remain 
     CMP   AL,'N'
     JE    EXIT                       
     CMP   AL,'n'
     JE    EXIT   
EXIT:MOV   AH,4CH           ;若不是Y则结束
     INT   21H    
;输入操作数子程序---------------------------------------------------------
Input1 PROC NEAR
     CALL  Enter
     LEA   DX,Tip1            ;输入第一个操作数提示
     MOV   AH,9  
     INT   21H                ;十进制输入提示
BCDin1:  
     MOV   AH,1
     INT   21H
     CMP   AL,0DH
     JE    EndBCDin1         ;等于回车继续入运算符
     CMP   AL,30H                          
     JB    BCDin1            ; <0时则重新输入
     CMP   AL,39H
     JA    BCDin1            ; >9时则重新输入
     AND   AL,0FH           ;清除高位    
     MOV   [SI],AL
     INC   SI
     LOOP  BCDin1
EndBCDin1:   
     CALL  Enter                  ;回车换行
     RET 
Input1  ENDP

Input2 PROC NEAR
     CALL  Enter
     LEA   DX,Tip3                ;输入第二个操作数提示
     MOV   AH,9  
     INT   21H                    ;十进制输入提示
BCDin2:  
     MOV   AH,1
     INT   21H
     CMP   AL,0DH
     JE    EndBCDin2             ;回车继续输入运算符
     CMP   AL,30H                          
     JB    BCDin1                ; <0时则重新输入
     CMP   AL,39H
     JA    BCDin1                ; >9时则重新输入
     AND   AL,0FH               ;清除高位    
     MOV   [SI],AL
     INC   SI
     LOOP  BCDin2
EndBCDin2:   
     CALL  Enter                  ;回车换行
     RET 
Input2  ENDP
;输入操作符子程序-------------------------------------------------------
Operat  PROC NEAR
ReOperat:
     CALL  Enter
     LEA   DX,Tip2               ;输入操作符提示
     MOV   AH,9  
     INT   21H               
     MOV   AH,1
     INT   21H
     CMP   AL,'+'
     JE    OperSave               ;若为"+",则存在oper
     CMP   AL,'-'
     JE    OperSave
     CMP   AL,'*'
     JE    OperSave
     CMP   AL,'/'
     JE    OperSave
     JMP   OperError
OperError:
     CALL  Enter
     LEA   DX,Error             ;输入操作符的错误提示
     MOV   AH,9  
     INT   21H
     JMP   ReOperat
OperSave: 
     MOV   OPER,AL
     RET
Operat ENDP
;计算方法子程序-----------------------------------------------------
Calculate PROC NEAR
     CALL  Enter                 ;回车换行
     MOV   BL,OPER
     CMP   BL,'+'
     JZ    ADCProc              ;若为加法,则转到adcProc 
     CMP   BL,'-'
     JZ    SUBProc
     CMP   BL,'*'
     JZ    MULProc
     CMP   BL,'/'
     JZ    DIVProc
ADCProc:
     CALL  StrResult              ;加法
     MOV   AL,OPS
     ADC   AL,OPD
     CALL  Displ
     JMP   endCalculate 
SUBProc:                          ;减法   
     CALL  StrResult  
     MOV   AL,OPS
     SUB   AL,OPD
     CALL  Displ
     JMP   endCalculate
MULProc:                          ;乘法
     CALL  StrResult  
     MOV   AL,OPD
     MUL   OPS
     CALL  Displ
     JMP   endCalculate
DIVProc:                           ;除法
     CALL  StrResult  
     MOV   AH,0
     MOV   AL,OPS
     DIV   OPD
     CALL  Displ
     JMP   endCalculate
endCalculate:
     RET
Calculate  ENDP
Displ   PROC NEAR 
     MOV   Tsave,AL
     MOV   AH,0
     MOV   AL,Tsave
     MOV   BL,100
     DIV   BL                     ;除以100
     CALL  Output                 ;显示百位数
     MOV   AL,AH
     MOV   AH,0
     MOV   BL,10
     DIV   BL                     ;除以10
     CALL  Output                  ;显示十位数
     MOV   AL,AH
     CALL  Output                  ;显示个位数
     RET
Displ   ENDP
StrResult  PROC NEAR 
     LEA   DX,Result
     MOV   AH,9  
     INT   21H
     RET   
StrResult  ENDP
Output PROC  NEAR                 ;十进制输出
     PUSH  AX
     ADD   AL,30H                 ;将AL中的十进制数变成ASCII码
     MOV   DL,AL
     MOV   AH,2
     INT   21H
     POP   AX
     RET
Output ENDP
;回车换行子程序---------------------------------------------------------
Enter  PROC NEAR             
     MOV   DL,0AH
     MOV   AH,2
     INT   21H
     MOV   DL,0DH
     MOV   AH,2
     INT   21H    
     RET
Enter  ENDP
;判断程序再次执行子程序-----------------------------------------------
StrQuit  PROC NEAR  
     CALL  Enter                      ;回车换行          
     LEA   DX,Quit  
     MOV   AH,9  
     INT   21H
     RET
StrQuit    ENDP 
CODE ENDS
     END   START

回复列表 (共1个回复)

沙发

呵呵呵……没人理你
要花很多时间的
以身相许   都可能没有人帮你弄

我来回复

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