⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 calc.asm

📁 汇编语言完成的简单四则运算演示程序 可以完成2个二位数的加、减、乘、除运算
💻 ASM
字号:
 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 '                     *       --------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 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -