高分悬赏,求微机原理与汇编语言课程设计,做一个四则运算计算器。请上传到我的知道!急~!!!!
展开全部
版本一, 电脑自己运算
ASSUME CS:CODE, DS:DATA, SS:STACK
DATA SEGMENT
NUM1 DB ?
NUM2 DB ?
TABLE DB '+-*/='
OPER DB ?
CRLF DB 0AH,0DH,'$'
DATA ENDS
STACK SEGMENT
DB 100 DUP (?)
STACK ENDS
CODE SEGMENT
START: MOV AX,DATA
MOV DS,AX
MOV AX,STACK
MOV SS,AX
MOV SP,100
;下面4句是获取2个随机数
CALL RAND_NUM1 ;获取随机数
MOV NUM1,AH
CALL RAND_NUM2
MOV NUM2,AH
CALL RAND_OPER ;获取4个随机数(0~3) 0表示加法,1表示减法,2表示乘法,3表示除法
MOV BX,OFFSET TABLE
MOV AL,AH
XLAT TABLE
MOV OPER, AL
DISPLAY: SUB AH,AH
MOV AL,NUM1
CALL DIS_NUM
CALL DIS_OPER
SUB AH,AH
MOV AL,NUM2
CALL DIS_NUM
CALL DIS_EQ
SUB AH,AH
CMP OPER,'+'
JZ OPER_ADD
CMP OPER,'-'
JZ OPER_SUB
CMP OPER,'/'
JZ OPER_DIV
MOV AL,NUM1
MOV CL,NUM2
MUL CL
JMP DONE
OPER_ADD: MOV AL,NUM1
ADD AL,NUM2
JMP DONE
OPER_SUB: MOV AL,NUM1
SUB AL,NUM2
TEST AL,80H
JZ DONE
NEG AL
MOV BL,AL
MOV AH,2
MOV DL,'-'
INT 21H
SUB AH,AH
MOV AL,BL
JMP DONE
OPER_DIV: MOV AH,0
MOV AL,NUM1
MOV CL,NUM2
DIV CL
MOV AH,0
JMP DONE
DIS_NUM: MOV CL,10
DIV CL
MOV BL,AH
MOV DL,AL
ADD DL,30H
MOV AH,2
INT 21H
MOV DL,BL
ADD DL,30H
INT 21H
RET
DIS_OPER: MOV AH,2
MOV DL,20H
INT 21H
MOV DL,OPER
INT 21H
MOV DL,20H ;打印空格
INT 21H
RET
DIS_EQ: MOV AH,2
MOV DL,20H
INT 21H
MOV DL,'='
INT 21H
MOV DL,20H
INT 21H
RET
DONE: MOV CH,0
MOV CL,10
DONE1: DIV CL
PUSH AX
SUB AH,AH
INC CH
CMP AL, 0
JNZ DONE1
MOV CL,CH
SUB CH,CH
DONE_LP: POP AX
MOV DL,AH
ADD DL,30H
MOV AH,2
INT 21H
LOOP DONE_LP
QT: MOV AH,9
LEA DX,CRLF
INT 21H
MOV AX,4C00H
INT 21H
;PAND_NUM子程序的功能是产生一个随机数0~100
RAND_NUM1:MOV AH,0
INT 1AH
MOV AX,DX
AND AH,3 ;为了在进行除法的时候不产生溢出
MOV DL,100 ;除101,产生0~99的余数
DIV DL
RET
;PAND_NUM子程序的功能是产生一个随机数0~100
RAND_NUM2:MOV AH,0
INT 1AH
MOV AX,CX
AND AH,3 ;为了在进行除法的时候不产生溢出
MOV DL,100 ;除101,产生0~99的余数
DIV DL
RET
;PAND_OPER子程序的功能是产生一个随机数0~3
RAND_OPER:MOV AH,0
INT 1AH
MOV AX,DX
AND AH,3 ;为了在进行除法的时候不产生溢出
MOV DL,4 ;除4,产生0~3的余数
DIV DL
RET
CODE ENDS
END START
版本二: 人机对话, 电脑随机出题, 人来回答
ASSUME CS:CODE, DS:DATA, SS:STACK
DATA SEGMENT
STR DB 'I get a expression to you, and please input a result',0AH,0DH,'$'
NUM1 DB ?
NUM2 DB ?
TABLE DB '+-*/='
OPER DB ?
RESULT DW ?
FLAG DB 0
BUF DB 7
DB ?
DB 7 dup (?)
CRLF DB 0AH,0DH,'$'
Y DB 'GOOD! BYE BYE!',0AH,0DH,'$'
N DB 'ERROR, Please input again!', 0AH,0DH,'$'
DATA ENDS
STACK SEGMENT
DB 100 DUP (?)
STACK ENDS
CODE SEGMENT
START: MOV AX,DATA
MOV DS,AX
MOV AX,STACK
MOV SS,AX
MOV SP,100
MOV AH,9
LEA DX,STR
INT 21H
;下面4句是获取2个随机数
CALL RAND_NUM1 ;获取随机数
MOV NUM1,AH
CALL RAND_NUM2
MOV NUM2,AH
CALL RAND_OPER ;获取4个随机数(0~3) 0表示加法,1表示减法,2表示乘法,3表示除法
MOV BX,OFFSET TABLE
MOV AL,AH
XLAT TABLE
MOV OPER, AL
DISPLAY: MOV RESULT, 0
SUB AX,AX
MOV AL,NUM1
CALL DIS_NUM
CALL DIS_OPER
SUB AX,AX
MOV AL,NUM2
CALL DIS_NUM
CALL DIS_EQ
;接收用户输入的字符串
MOV AH,10
LEA DX,BUF
INT 21H
MOV CL,BUF+1
LEA SI,BUF+2
CMP BYTE PTR [SI],'-' ;如果用户输入字符串有符号(这里只有减法运算有可能有符号),那么求补
JNZ LP0
MOV FLAG,1 ;FLAG = 1,表示有符号
INC SI ;跳过符号
DEC CL ;循环次数减1
LP0: MOV AX,RESULT
MOV BL,10
LP: MUL BL
ADD AL,[SI]
SUB AL,30H
INC SI
LOOP LP
MOV RESULT,AX
SUB AX,AX
CMP OPER,'+' ;加法
JZ OPER_ADD
CMP OPER,'-' ;减法
JZ OPER_SUB
CMP OPER,'/' ;除法
JZ OPER_DIV
MOV AL,NUM1 ;乘法
MOV CL,NUM2
MUL CL
JMP DONE
OPER_ADD: MOV AL,NUM1
ADD AL,NUM2 ;结果存于AX(这时候AH = 0),然后跳转到DONE,与RESULT比较,一样就正确,不一样就不正确
JMP DONE
OPER_SUB: MOV AL,NUM1
SUB AL,NUM2
CMP FLAG,1
JNZ OPER_SUB1
NEG AL
OPER_SUB1:JMP DONE
OPER_DIV: MOV AL,NUM1
MOV CL,NUM2
DIV CL
SUB AH,AH
JMP DONE
DIS_NUM: MOV CL,10 ;显示数,因为这里是2位数,2位数除以10后,AH保存的是余数(个位),AL保存的是商(十位)
DIV CL
MOV BL,AH
MOV AH,2
MOV DL,AL
ADD DL,30H
INT 21H
MOV DL,BL
ADD DL,30H
INT 21H
RET
DIS_OPER: MOV AH,2 ;显示操作数,OPER已经在前面求出了
MOV DL,20H
INT 21H
MOV DL,OPER
INT 21H
MOV DL,20H ;打印空格
INT 21H
RET
DIS_EQ: MOV AH,2
MOV DL,20H
INT 21H
MOV DL,'='
INT 21H
MOV DL,20H
INT 21H
RET
DONE: CMP AX,RESULT
JZ YES
MOV AH,9
LEA DX,N
INT 21H
JMP DISPLAY
YES: MOV AH,9
LEA DX,CRLF
INT 21H
LEA DX,Y
INT 21H
QT: MOV AX,4C00H
INT 21H
;PAND_NUM子程序的功能是产生一个随机数0~100
RAND_NUM1:MOV AH,0
INT 1AH
MOV AX,DX ;这里是DX
AND AH,3 ;为了在进行除法的时候不产生溢出
MOV DL,100 ;除101,产生0~99的余数
DIV DL
RET
;PAND_NUM子程序的功能是产生一个随机数0~100
RAND_NUM2:MOV AH,0
INT 1AH
MOV AX,CX ;这里是CX
AND AH,3 ;为了在进行除法的时候不产生溢出
MOV DL,100 ;除101,产生0~99的余数
DIV DL
RET
;PAND_OPER子程序的功能是产生一个随机数0~3
RAND_OPER:MOV AH,0
INT 1AH
MOV AX,DX
AND AH,3 ;为了在进行除法的时候不产生溢出
MOV DL,4 ;除4,产生0~3的余数
DIV DL
RET
CODE ENDS
END START
PS:若有不明白的地方, 请追问
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询