汇编语言编的计算器 50
Writeanassemblylanguageprogramthatworkslikeatinycalculatorthathandlesallthefollowingo...
Write an assembly language program that works like a tiny calculator that handles all the following operations using unsigned integer arithmetic:
“+”add the following number to the result.
“*”multiply the following number by the result.
“/”divide the following number into the result.
“-”subtract the following number from the result.
“=”display the result (and start a new line).
c or C clear the result (and start a new line).
“.”end program execution.
The following table summarizes the precedence of these operators. Operators on the same line have the same precedence; rows are in order of decreasing precedence. So for example in the expression 12+4*3/2+2, the multiplication and the division are executed before the additions, yielding the result 12+6+2=20 .
简单的说就是用汇编语言编一个程序实现加减乘除计算功能的计算器,要求这个计算器可以判断运算符优先权。
万分感谢! 展开
“+”add the following number to the result.
“*”multiply the following number by the result.
“/”divide the following number into the result.
“-”subtract the following number from the result.
“=”display the result (and start a new line).
c or C clear the result (and start a new line).
“.”end program execution.
The following table summarizes the precedence of these operators. Operators on the same line have the same precedence; rows are in order of decreasing precedence. So for example in the expression 12+4*3/2+2, the multiplication and the division are executed before the additions, yielding the result 12+6+2=20 .
简单的说就是用汇编语言编一个程序实现加减乘除计算功能的计算器,要求这个计算器可以判断运算符优先权。
万分感谢! 展开
1个回答
展开全部
CURS MACRO A,B
MOV AH,2 ;置光标位置
MOV BH,0 ;页号为0
MOV DH,A ;设置光标的坐标为(A.B)
MOV DL,B
INT 10H ;BIOS调用
ENDM
;-------------------------------
DISPMSG MACRO MESSAGE
LEA DX,MESSAGE ;传递MESSAGE的偏移地址
MOV AH,9 ;显示字符串
INT 21H ;DOS调用
ENDM
;----------------------------------
CLEAR MACRO COLOR ;清屏
MOV AH,6 ;屏幕初始化
MOV AL,0 ;页号
MOV CH,0 ;设置左上角的坐标为(0,0)
MOV CL,0
MOV DL,100 ;设置右上角的坐标为(100,100)
MOV DH,100
MOV BH,COLOR ;卷入行属性
INT 10H ;BIOS调用
ENDM
.MODEL SMALL
.STACK
.DATA ;数据段定义
MSG0 DB '* * * * * * * * * * * * * * * * * * * *',0DH,0AH ;,0dh,0ah,0dh,0ah
DB ' * *',0DH,0AH
;db '* *',0dh,0ah
;db '* *',0dh,0ah
DB ' * --------COUNTER-------- *',0DH,0AH ;,0dh,0ah,0dh,0ah
DB ' * *',0DH,0AH
DB ' * *',0DH,0AH
DB ' * *',0DH,0AH
DB ' * DATA1:'
DB '_______________ *',0DH,0AH ;,0dh,0ah,0dh,0ah,0dh
DB ' * *',0DH,0AH
DB ' * *',0DH,0AH
DB ' * *',0DH
DB ' * DATA2:'
DB '_______________ *',0DH,0AH ;,0dh,0ah,0dh,0ah,0dh
DB ' * *',0DH,0AH
DB ' * *',0DH,0AH
DB ' * *',0DH
DB ' * RESULT:'
DB '_______________ *',0DH,0AH,0DH ;,0ah,0dh,0ah,0dh,0ah,0dh,0ah,0dh,0ah,0dh
DB ' * *',0DH,0AH
DB ' * *',0DH,0AH
DB ' * *',0DH,0AH
DB ' * *',0DH,0AH
DB ' * *',0DH,0AH
DB ' * * * * * * * * * * * * * * * * * * * *','$'
MSG1 DB 'choose +,-,*,/','$'
MSG2 DB 'you choose wrong','$',0AH,0DH
MSG3 DB 'Press ESC to Exit!',0DH,0AH,'$'
MSG4 DB 'Press any key to continue!',0DH,0AH,'$'
MSG5 DB '-','$'
MSG6 DB '.','$'
MSG7 DB 'error input!','$'
MSG8 DB 'data2 is wrong!','$'
DATA1 DW ?
DATA2 DW ?
.CODE ;代码段从这里开始
;--------------------------------------------
DEC_DIV PROC NEAR
CWD ;将字转换为双字,AX内容符号扩展到DX
DIV CX
PUSH DX
MOV DL,AL
ADD DL,30H ;将不是数字的字符转换为数字
MOV AH,2 ;显示输出
INT 21H ;DOS调用
POP DX
MOV AX,DX
RET
DEC_DIV ENDP
;------------------------------------------
CHANGE PROC NEAR ;该子程序的功能:将AX中存储的十六进制数转换为十进制数
CMP AX,1000
JAE C1 ;AX≥1000则转移
CMP AX,100
JAE C2 ;AX≥100则转移
CMP AX,10
JAE C3 ;AX≥10则转移
JMP C4 ;AX<10
C1: MOV CX,1000D
CALL DEC_DIV
C2: MOV CX,100D
CALL DEC_DIV
C3: MOV CX,10D
CALL DEC_DIV
C4: MOV CX,1D
CALL DEC_DIV
RET
CHANGE ENDP
;-------------------------------
BEGIN PROC NEAR
BACK: CLEAR 1EH
CURS 2,20 ;设置光标为(2.20)
DISPMSG MSG0 ;显示用户界面
CURS 8,41 ;设置光标为(8,41) ,第一行
MOV BX,0
MOV CX,2
NEWCHAR1:
MOV AH,1 ;键盘输入并回显
INT 21H ;DOS调用
CMP AL,30H ;检查输入的字符是不是数字
JAE J1 ;如果不是,则转移至J1
JMP D2 ;是,转移到D2执行
J1: CMP AL,39H ; 与9的ASCII侣氡
JBE J2 ;如果输入的字符是0-9,则转移至J2
JMP D2 ;如果不是数字,则转移至D2
J2: SUB AL,30H
CBW ;AL的内容符号扩展到AH
XCHG AX,BX
MOV DI,10
MUL DI
XCHG AX,BX
ADD BX,AX
LOOP NEWCHAR1
MOV DATA1,BX
CURS 11,41 ;设置光标位为(11,40),第二行
MOV BX,0
MOV CX,2
NEWCHAR2:
MOV AH,1 ;键盘输入并回显
INT 21H ;DOS调用
CMP AL,30H ;与0的ASCII码比较
JAE J3 ;如果输入数字大于等于0则跳转至J3
JMP D2
J3: CMP AL,39H ;与9比较
JBE J4 ;如果小于或等于9则跳转
JMP D2 ;如果输入不是数字则跳转
J4: SUB AL,30H ;如果输入不是0-9,则转化成相应的字符
CBW ;将AL符号扩展到AH
XCHG AX,BX
MOV DI,10
MUL DI
XCHG AX,BX
ADD BX,AX
LOOP NEWCHAR2
MOV DATA2,BX
MOV AX,DATA1
MOV BX,DATA2
PUSH AX
PUSH BX
CURS 15,33 ;设置光标的位置为(15.33),第三行
DISPMSG MSG1 ;显示提示信息
MOV AH,1 ;接受键盘输入并回显
INT 21H ;DOS调用
CMP AL,'+'
JE ADDI ;如果运算符为+,则计算两数之和
CMP AL,'-'
JE SUBT ;如果运算符为-,则计算两数之差
CMP AL,'*'
JE MULT ;如果运算符为*,则计算两数之积
CMP AL,'/'
JE DIVI ;如果运算符为/,则计算两数之商
CURS 16,25 ;设置光标为(16,25)
DISPMSG MSG2 ;在屏幕上输出提示信息
JMP D1
;----------------------------------------
;ADD THE TWO DATAS
ADDI: POP BX
POP AX
ADD AX,BX ;计算两数字之和
PUSH AX
CURS 14,41 ;设置光标位置为(14,41)
POP AX
CALL CHANGE ;将结果转换为十进制数
JMP D1
;---------------------------------------
;SUBTRACT THE TWO DATAS
SUBT: POP BX
POP AX
CMP AX,BX ;比较两数大小
JAE D0 ;如果AX>=BX则跳转
XCHG AX,BX
PUSH AX
PUSH BX
CURS 14,40 ;设置光标位置为(14,40)
DISPMSG MSG5 ;在屏幕上显示负号
POP BX
POP AX
D0: SUB AX,BX ;计算两数之差
PUSH AX
CURS 14,41 ;设置光标位置为(14,41)
POP AX
CALL CHANGE ;将结果转换为十进制数
JMP D1
;---------------------------------------
;MULTIPLY THE TWO DATAS
MULT: POP BX
POP AX
MUL BX ;计算两数之积
PUSH AX
CURS 14,41 ;设置光标位置为(14,41)
POP AX
CALL CHANGE ;将结果转换为十进制数
JMP D1
;---------------------------------------
;DIVIDE THE TWO DATAS
DIVI: POP BX
POP AX
CMP BX,0 ;判断除数是否为0
JE ERROR ;如果是0则跳转
CWD
DIV BX ;计算两数之商
PUSH DX
PUSH AX
CURS 14,41 ;设置光标位置为(14,41)
POP AX
CALL CHANGE ;将十六进制数转换为十进制数
POP DX
CMP DX,0
JNE LOP ;如果DX不等于0则跳转
JMP D1
LOP: MOV CX,4 ;设置精确度为小数点后4位
PUSH DX
DISPMSG MSG6 ;输出小数点
POP DX
CON: PUSH BX
MOV AX,DX
MOV BX,10
MUL BX
POP BX
CWD ;将AX的内容符号扩展到双字
DIV BX ;计算小数点后每一位的数字
PUSH DX
PUSH CX
CALL CHANGE ;将十六进制数转化为十进制数
POP CX
POP DX
CMP DX,0 ;判断是否已经计算到小数点后第六位
JE D1 ;如果是,则跳转
LOOP CON ;如果不是,就继续计算
ERROR: CURS 15,33 ;设置光标位置为(15,33)
DISPMSG MSG8 ;提示出错
D1: RET
D2: PUSH AX
PUSH BX
CURS 15,33 ;设置光标位置为(15,33)
DISPMSG MSG7 ;提示输入出错
POP BX
POP AX
RET
BEGIN ENDP
;----------------------------------------
MAIN PROC NEAR
MOV AX,@DATA
MOV DS,AX
MOV ES,AX
PUSH DS
XOR AX,AX
PUSH AX
MOV DATA2,0 ;将缓冲区清空
MOV DATA1,0
AGAIN:
CALL BEGIN
CURS 16,23 ;设置光标位置为(16.23)
DISPMSG MSG3 ;在屏幕上输出提示信息,提示退出的方法
CURS 17,23 ;设置光标位置为(17.23)
DISPMSG MSG4 ;在屏幕上输出提示信息,提示继续的方法
MOV AH,7 ;键盘输入,无回显
INT 21H ;DOS调用
CMP AL,27 ;判断输入的是否为ESC
JNE AGAIN ;如果不是就继续执行以上运算
EXIT: MOV AX,4C00H ;如果是就退出系统
INT 21H ;DOS调用
MAIN ENDP
END MAIN
MOV AH,2 ;置光标位置
MOV BH,0 ;页号为0
MOV DH,A ;设置光标的坐标为(A.B)
MOV DL,B
INT 10H ;BIOS调用
ENDM
;-------------------------------
DISPMSG MACRO MESSAGE
LEA DX,MESSAGE ;传递MESSAGE的偏移地址
MOV AH,9 ;显示字符串
INT 21H ;DOS调用
ENDM
;----------------------------------
CLEAR MACRO COLOR ;清屏
MOV AH,6 ;屏幕初始化
MOV AL,0 ;页号
MOV CH,0 ;设置左上角的坐标为(0,0)
MOV CL,0
MOV DL,100 ;设置右上角的坐标为(100,100)
MOV DH,100
MOV BH,COLOR ;卷入行属性
INT 10H ;BIOS调用
ENDM
.MODEL SMALL
.STACK
.DATA ;数据段定义
MSG0 DB '* * * * * * * * * * * * * * * * * * * *',0DH,0AH ;,0dh,0ah,0dh,0ah
DB ' * *',0DH,0AH
;db '* *',0dh,0ah
;db '* *',0dh,0ah
DB ' * --------COUNTER-------- *',0DH,0AH ;,0dh,0ah,0dh,0ah
DB ' * *',0DH,0AH
DB ' * *',0DH,0AH
DB ' * *',0DH,0AH
DB ' * DATA1:'
DB '_______________ *',0DH,0AH ;,0dh,0ah,0dh,0ah,0dh
DB ' * *',0DH,0AH
DB ' * *',0DH,0AH
DB ' * *',0DH
DB ' * DATA2:'
DB '_______________ *',0DH,0AH ;,0dh,0ah,0dh,0ah,0dh
DB ' * *',0DH,0AH
DB ' * *',0DH,0AH
DB ' * *',0DH
DB ' * RESULT:'
DB '_______________ *',0DH,0AH,0DH ;,0ah,0dh,0ah,0dh,0ah,0dh,0ah,0dh,0ah,0dh
DB ' * *',0DH,0AH
DB ' * *',0DH,0AH
DB ' * *',0DH,0AH
DB ' * *',0DH,0AH
DB ' * *',0DH,0AH
DB ' * * * * * * * * * * * * * * * * * * * *','$'
MSG1 DB 'choose +,-,*,/','$'
MSG2 DB 'you choose wrong','$',0AH,0DH
MSG3 DB 'Press ESC to Exit!',0DH,0AH,'$'
MSG4 DB 'Press any key to continue!',0DH,0AH,'$'
MSG5 DB '-','$'
MSG6 DB '.','$'
MSG7 DB 'error input!','$'
MSG8 DB 'data2 is wrong!','$'
DATA1 DW ?
DATA2 DW ?
.CODE ;代码段从这里开始
;--------------------------------------------
DEC_DIV PROC NEAR
CWD ;将字转换为双字,AX内容符号扩展到DX
DIV CX
PUSH DX
MOV DL,AL
ADD DL,30H ;将不是数字的字符转换为数字
MOV AH,2 ;显示输出
INT 21H ;DOS调用
POP DX
MOV AX,DX
RET
DEC_DIV ENDP
;------------------------------------------
CHANGE PROC NEAR ;该子程序的功能:将AX中存储的十六进制数转换为十进制数
CMP AX,1000
JAE C1 ;AX≥1000则转移
CMP AX,100
JAE C2 ;AX≥100则转移
CMP AX,10
JAE C3 ;AX≥10则转移
JMP C4 ;AX<10
C1: MOV CX,1000D
CALL DEC_DIV
C2: MOV CX,100D
CALL DEC_DIV
C3: MOV CX,10D
CALL DEC_DIV
C4: MOV CX,1D
CALL DEC_DIV
RET
CHANGE ENDP
;-------------------------------
BEGIN PROC NEAR
BACK: CLEAR 1EH
CURS 2,20 ;设置光标为(2.20)
DISPMSG MSG0 ;显示用户界面
CURS 8,41 ;设置光标为(8,41) ,第一行
MOV BX,0
MOV CX,2
NEWCHAR1:
MOV AH,1 ;键盘输入并回显
INT 21H ;DOS调用
CMP AL,30H ;检查输入的字符是不是数字
JAE J1 ;如果不是,则转移至J1
JMP D2 ;是,转移到D2执行
J1: CMP AL,39H ; 与9的ASCII侣氡
JBE J2 ;如果输入的字符是0-9,则转移至J2
JMP D2 ;如果不是数字,则转移至D2
J2: SUB AL,30H
CBW ;AL的内容符号扩展到AH
XCHG AX,BX
MOV DI,10
MUL DI
XCHG AX,BX
ADD BX,AX
LOOP NEWCHAR1
MOV DATA1,BX
CURS 11,41 ;设置光标位为(11,40),第二行
MOV BX,0
MOV CX,2
NEWCHAR2:
MOV AH,1 ;键盘输入并回显
INT 21H ;DOS调用
CMP AL,30H ;与0的ASCII码比较
JAE J3 ;如果输入数字大于等于0则跳转至J3
JMP D2
J3: CMP AL,39H ;与9比较
JBE J4 ;如果小于或等于9则跳转
JMP D2 ;如果输入不是数字则跳转
J4: SUB AL,30H ;如果输入不是0-9,则转化成相应的字符
CBW ;将AL符号扩展到AH
XCHG AX,BX
MOV DI,10
MUL DI
XCHG AX,BX
ADD BX,AX
LOOP NEWCHAR2
MOV DATA2,BX
MOV AX,DATA1
MOV BX,DATA2
PUSH AX
PUSH BX
CURS 15,33 ;设置光标的位置为(15.33),第三行
DISPMSG MSG1 ;显示提示信息
MOV AH,1 ;接受键盘输入并回显
INT 21H ;DOS调用
CMP AL,'+'
JE ADDI ;如果运算符为+,则计算两数之和
CMP AL,'-'
JE SUBT ;如果运算符为-,则计算两数之差
CMP AL,'*'
JE MULT ;如果运算符为*,则计算两数之积
CMP AL,'/'
JE DIVI ;如果运算符为/,则计算两数之商
CURS 16,25 ;设置光标为(16,25)
DISPMSG MSG2 ;在屏幕上输出提示信息
JMP D1
;----------------------------------------
;ADD THE TWO DATAS
ADDI: POP BX
POP AX
ADD AX,BX ;计算两数字之和
PUSH AX
CURS 14,41 ;设置光标位置为(14,41)
POP AX
CALL CHANGE ;将结果转换为十进制数
JMP D1
;---------------------------------------
;SUBTRACT THE TWO DATAS
SUBT: POP BX
POP AX
CMP AX,BX ;比较两数大小
JAE D0 ;如果AX>=BX则跳转
XCHG AX,BX
PUSH AX
PUSH BX
CURS 14,40 ;设置光标位置为(14,40)
DISPMSG MSG5 ;在屏幕上显示负号
POP BX
POP AX
D0: SUB AX,BX ;计算两数之差
PUSH AX
CURS 14,41 ;设置光标位置为(14,41)
POP AX
CALL CHANGE ;将结果转换为十进制数
JMP D1
;---------------------------------------
;MULTIPLY THE TWO DATAS
MULT: POP BX
POP AX
MUL BX ;计算两数之积
PUSH AX
CURS 14,41 ;设置光标位置为(14,41)
POP AX
CALL CHANGE ;将结果转换为十进制数
JMP D1
;---------------------------------------
;DIVIDE THE TWO DATAS
DIVI: POP BX
POP AX
CMP BX,0 ;判断除数是否为0
JE ERROR ;如果是0则跳转
CWD
DIV BX ;计算两数之商
PUSH DX
PUSH AX
CURS 14,41 ;设置光标位置为(14,41)
POP AX
CALL CHANGE ;将十六进制数转换为十进制数
POP DX
CMP DX,0
JNE LOP ;如果DX不等于0则跳转
JMP D1
LOP: MOV CX,4 ;设置精确度为小数点后4位
PUSH DX
DISPMSG MSG6 ;输出小数点
POP DX
CON: PUSH BX
MOV AX,DX
MOV BX,10
MUL BX
POP BX
CWD ;将AX的内容符号扩展到双字
DIV BX ;计算小数点后每一位的数字
PUSH DX
PUSH CX
CALL CHANGE ;将十六进制数转化为十进制数
POP CX
POP DX
CMP DX,0 ;判断是否已经计算到小数点后第六位
JE D1 ;如果是,则跳转
LOOP CON ;如果不是,就继续计算
ERROR: CURS 15,33 ;设置光标位置为(15,33)
DISPMSG MSG8 ;提示出错
D1: RET
D2: PUSH AX
PUSH BX
CURS 15,33 ;设置光标位置为(15,33)
DISPMSG MSG7 ;提示输入出错
POP BX
POP AX
RET
BEGIN ENDP
;----------------------------------------
MAIN PROC NEAR
MOV AX,@DATA
MOV DS,AX
MOV ES,AX
PUSH DS
XOR AX,AX
PUSH AX
MOV DATA2,0 ;将缓冲区清空
MOV DATA1,0
AGAIN:
CALL BEGIN
CURS 16,23 ;设置光标位置为(16.23)
DISPMSG MSG3 ;在屏幕上输出提示信息,提示退出的方法
CURS 17,23 ;设置光标位置为(17.23)
DISPMSG MSG4 ;在屏幕上输出提示信息,提示继续的方法
MOV AH,7 ;键盘输入,无回显
INT 21H ;DOS调用
CMP AL,27 ;判断输入的是否为ESC
JNE AGAIN ;如果不是就继续执行以上运算
EXIT: MOV AX,4C00H ;如果是就退出系统
INT 21H ;DOS调用
MAIN ENDP
END MAIN
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询