主题:请大虾们帮忙改一下这个计算器程序啊~~急用~~
下面的程序是从网上搜到的一个关于计算器的代码,小女子是个电脑白痴啊,尤其是编程,要交作业啦~~所以想请大虾们帮忙改一下啊~~
[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
[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