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

📄 js2.asm

📁 一个功能简单的计算器内有详细的说明
💻 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 '* *',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,11 ;设置光标为(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,11 ;设置光标位为(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,21 ;设置光标位置为(14,11)  
 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,10 ;设置光标位置为(14,40)  
 DISPMSG MSG5 ;在屏幕上显示负号  
 POP BX  
 POP AX  
 D0: SUB AX,BX ;计算两数之差  
 PUSH AX  
 CURS 14,11 ;设置光标位置为(14,41)  
 POP AX  
 CALL CHANGE ;将结果转换为十进制数  
 JMP D1  
;---------------------------------------  
;MULTIPLY THE TWO DATAS   
 MULT: POP BX  
 POP AX  
 MUL BX ;计算两数之积  
 PUSH AX  
 CURS 14,11 ;设置光标位置为(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,11 ;设置光标位置为(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 + -