hym19920320 hym19920320
凡人一个,等着穿越
关注数: 53 粉丝数: 801 发帖数: 1,021 关注贴吧数: 34
应用汇编语言编写程序,设计一个简单的计算器,要求基本功能:... 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 ' * --------caculater-------- *',0DH,0AH ;,0dh,0ah,0dh,0ah DB ' * *',0DH,0AH DB ' * *',0DH,0AH DB ' * *',0DH,0AH DB ' * NUM1:' DB ' *',0DH,0AH ;,0dh,0ah,0dh,0ah,0dh DB ' * *',0DH,0AH DB ' * *',0DH,0AH DB ' * *',0DH DB ' * NUM2:' 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!','$' NUM1 DW ? NUM2 DW ? 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 NUM1,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 NUM2,BX MOV AX,NUM1 MOV BX,NUM2 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 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 MULT: POP BX POP AX MUL BX ;计算两数之积 PUSH AX CURS 14,41 ;设置光标位置为(14,41) POP AX CALL CHANGE ;将结果转换为十进制数 JMP D1 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
1 下一页