logo资料库

用汇编语言编写简单的计算器.doc

第1页 / 共9页
第2页 / 共9页
第3页 / 共9页
第4页 / 共9页
第5页 / 共9页
第6页 / 共9页
第7页 / 共9页
第8页 / 共9页
资料共9页,剩余部分请下载后查看
简单的计算器
一、题目编写一个有符号多位十进制数的四则运算计算器程序
二、目的和要求
三、设计思想1,定义A,B作为存入两个操作数,H,L存入高位和低位,COUNTA,COUNTB位暂存器
2,在STR1的提示下,输入一个字符,若为Q/q则结束,若为数字0-9则放入[SI]中,程序读出两个
3,对于减法运算,若被减数比减数小,则交换两操作数进行运算,结果显示为负。对于除法运算,显示商和余数
4,最后结果转换成十进制输出
四、程序流程图
简单的计算器 一、 题目 编写一个有符号多位十进制数的四则运算计算器程序 二、 目的和要求 编写一个有符号多位十进制数的四则运算计算器程序,所输入的算式如下例所示: -278+32= -132――12= 11*-32= -1234/-18= 要求程序能接收键入的算式,在接收到‘=’号时,计算并以有符号十进制数的形 式显示结果,然后允许用户继续键入算式。如果键入算式后再键入‘.’,则显示结 果并结束整个程序。(‘/’为整除) 三、 设计思想 1,定义A,B作为存入两个操作数,H,L存入高位和低位,COUNTA,COUNTB 位 暂存器,存 A,B 的字节数。S 用来存放运算符+|-|*|/,AB 的偏移地址放入[SI], [SI]的内容即为输入的两个操作数 A,B 2,在 STR1 的提示下,输入一个字符,若为 Q/q 则结束,若为数字 0-9 则放入[SI] 中,程序读出两个操作数 A,B 并将其转换成二进制数进行四则运算。 3,对于减法运算,若被减数比减数小,则交换两操作数进行运算,结果显示为负。 对于除法运算,显示商和余数。 4,最后结果转换成十进制输出 四、 程序流程图 开始 输入一个字符 Q/q 0-9,Q/q? 都不是 判断出错 0-9 再输入一个字符 Q/q 0-9,+|-|*|/ 0-9,=,Q/q,+|-|*|/? 都不是 结束 = 输出结果
五、 源程序 STACK SEGMENT STACK 'STACK' DW 64 DUP(?) STACK ENDS DATA SEGMENT STR1 DB 'JiSuan A + - * / B ',0DH,0AH,'Input Q Quit',0dh,0ah,'Please Input :',0DH,0AH,'$' STR2 DB 0DH,0AH,'Input error,please input again or quit:',0DH,0AH,'$' STR3 DB '........$' AB DB 12 DUP(?) A DW 0 B DW 0 C DB 15 DUP(?) C0 DB 14 DUP(?) C1 DW 0 D DB ? S DB 0 COUNTA DW ? COUNTB DW ? H DW 0 L DW 0 DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA,SS:STACK START: SL: MOV AX,DATA MOV DS,AX LEA DX,STR1 MOV AH,9 INT 21H MOV DL,0DH MOV AH,2 INT 21H MOV DL,0AH MOV AH,2 INT 21H MOV S,0 ;输出字符串 STR1 ;回车换行
;输入一个字符 ;为‘Q’或‘q’则终止 ;判断数字不在 0 - 9 则出错 ;BX 清零 MOV C1,0 LEA SI,AB MOV AH,1 INT 21H MOV [SI],AL MOV D,AL CMP D,'Q' JZ Q CMP D,'q' JZ Q CMP AL,30H JB WR CMP D,39H JA WR MOV BX,0 LOOP1: INC BX MOV AH,1 INT 21H MOV [SI+BX],AL MOV D,AL CMP D,'Q' JZ Q CMP D,'q' JZ Q CMP D,'+' JZ A1 CMP D,'-' JZ A1 CMP D,'*' JZ A1 CMP D,'/' JZ A1 CMP D,'=' JZ A2 CMP D,' ' JZ A3 CMP D,30H
JB WR CMP D,39H JA WR JMP LOOP1 Q: JMP QUIT WR: LEA DX,STR2 MOV AH,9 INT 21H JMP SL A1: CMP S,0 JNZ WR DEC BX ;出错则返回重新输入运算式 MOV COUNTA,BX ;取第一个输入的数 A ;将运算符+|-|*|/放入 S ;取第二个输入的数 B ;将 A,B 转换成二进制后进行四则运算 MOV AL,D MOV S,AL JMP LOOP1 A2: CMP S,0 JZ XS0 DEC BX MOV COUNTB,BX CALL ASC_BIN CMP S,'+' JZ P1 CMP S,'-' JZ P2 CMP S,'*' JZ P3 CMP S,'/' JZ P4 A3: MOV DL,'=' MOV AH,2 INT 21H JMP A2 P1: CALL P01 JMP SL P2: CALL P02 JMP SL P3: CALL P03
JMP SL P4: CALL P04 JMP SL XS0: LEA SI,AB ADD SI,BX MOV AL,'$' MOV [SI],AL LEA SI,AB mov dx,si MOV AH,9 INT 21H JMP SL P01 PROC ;加法,A+B 高位存入 H,低位存入 L ;用来将二进制转换成十进制输出,并返回重新输入运算式 ;减法,若 A
MOV L,AX MOV H,0 CALL XS RET P02 ENDP P03 PROC MOV DX,0 MOV AX,A MUL B MOV L,AX MOV H,DX CALL XS RET P03 ENDP P04 PROC MOV DX,0 MOV AX,A DIV B PUSH DX MOV H,0 MOV L,AX CALL XS LEA DX,STR3 MOV AH,9 INT 21H mov c1,0 POP DX MOV H,0 MOV L,DX CALL XS RET ;乘法,A*B,结果高位存入 H,低位存入 L ;除法,A/B,并显示余数,高位 0 存入 H,低位存入 L ;显示商 ;显示余数 P04 ENDP ASC_BIN PROC ;将十进制转换成二进制 INC COUNTA MOV CX,COUNTA MOV AX,0 MOV BX,10 LEA SI,AB
LOOP01: MOV DL,[SI] AND DL,0FH MOV [SI],DL MUL BX MOV DL,[SI] MOV DH,0 ADD AX,DX INC SI LOOP LOOP01 MOV DX,SI LEA SI,AB SUB DX,SI MOV SI,DX CMP SI,COUNTA JNZ LOOP02 MOV A,AX MOV AX,COUNTB DEC COUNTA SUB AX,COUNTA MOV CX,AX LEA SI,AB INC COUNTA ADD SI,COUNTA MOV AX,0 JMP LOOP01 LOOP02: MOV B,AX RET ASC_BIN ENDP BIN_ASC PROC MOV BX,10 LEA DI,C0 LP1: MOV DX,0 MOV AX,H CMP AX,0 JZ LP2 DIV BX MOV H,AX MOV AX,L
LP2: LP3: DIV BX MOV L,AX OR DL,30H MOV [DI],DL INC DI INC C1 JMP LP1 MOV AX,L CMP AX,0 JZ LP4 MOV DX,0 DIV BX OR DL,30H MOV [DI],DL INC DI INC C1 JMP LP3 LP4: CMP C1,0 JNZ LP5 MOV AL,30H MOV [DI],AL INC C1 LP5: RET BIN_ASC ENDP XS PROC CALL BIN_ASC CALL SC RET XS ENDP SC PROC MOV CX,C1 DEC C1 LEA SI,C0 ADD SI,C1 LEA DI,C LP:MOV AL,[SI] MOV [DI],AL DEC SI ;结果输出
分享到:
收藏