📄 2.asm
字号:
;宏定义部分
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
DISP MACRO M ;定义宏DISP显示字符串
LEA DX,M
MOV AH,09
INT 21H
ENDM
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
DISP1 MACRO N ;定义宏DISP1显示1个字符
MOV DL,N
MOV AH,2
INT 21H
ENDM
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
DISPCOLOR MACRO STR,LEN,ROW,COLOR,CHAR ;定义宏DISPCOLOR彩显字符串
MOV BP,SEG STR ;取STR串段地址
MOV ES,BP
MOV BP,OFFSET STR ;取STR串偏移地址
MOV CX,LEN ;字符串长度
MOV DH,ROW ;置行属性
MOV DL,0 ;置列属性
MOV BL,COLOR ;置颜色属性
MOV AL,CHAR ;置光标属性
MOV AH,13H
INT 10H
ENDM
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
DISPCOL MACRO COL,NUM ;定义宏DISPCOL彩显若干个字符
MOV AH,9
MOV BH,0 ;置显示页
MOV BL,COL ;置颜色属性
MOV CX,NUM ;字符显示次数
INT 10H
ENDM
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
WIN MACRO OPR1,OPR2,OPR3,OPR4,OPR5,OPR6 ;定义宏WIN建立窗口
MOV AH,06H ;功能号
MOV AL,OPR1 ;AL=0初始化或AL=上卷行数
MOV BH,OPR2 ;置卷入行属性
MOV CH,OPR3 ;置左上行
MOV CL,OPR4 ;置左上列
MOV DH,OPR5 ;置右上行
MOV DL,OPR6 ;置右上列
INT 10H
ENDM
;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
;程序开始
DATA SEGMENT
X DB ?
Y DB ?
Z DW ?
W DW ?
COU DB ?
SAVE_LC DW 2 DUP(?)
DAT1 DB 11 DUP(-1)
DAT2 DB 20 DUP(?)
RESULT DW 20 DUP(?)
MESS0 DB 0DH,0AH, 25 DUP(?),201," XIAO XUE SHENG JIA FA CE SHI",187,25 DUP(?),'$'
LENMESS0 EQU $-MESS0-1
MESS1 DB 0DH,0AH,"please input number:",0ah,0dh,'$'
LENMESS1 EQU $-MESS1-1
MESS2 DB 0DH,0AH,'You are Right! $'
MESS3 DB 0DH,0AH,'You are Wrong!$'
MESS4 DB 0DH,0AH,'The Right Answer is: $'
MESS5 DB 0DH,0AH,'Your Marks will add 10!$'
MESS6 DB 0DH,0AH,'Your Marks in total are: $'
LENMESS6 EQU $-MESS6-1
MESS7 DB 0DH,0AH,'Do you want to Test again? (Y/N) $'
LENMESS7 EQU $-MESS7-1
DATA ENDS
;==========================================================================================
CODE SEGMENT
MAIN PROC FAR
ASSUME CS:CODE,DS:DATA
START:
PUSH DS
SUB AX,AX
PUSH AX
MOV AX,DATA
MOV DS,AX
MOV ES,AX
MOV Y,0
MOV Z,0
MOV DI,0
MOV AH,0 ;设置25*80 彩色文本
MOV AL,3
INT 10H
DISPCOLOR MESS0,LENMESS0,01H,7dh,01
DISPCOLOR MESS1,LENMESS1,02h,23H,01
CALL CRLF
mov ah,01
int 21h
sub al,30h
mov cou, al
CALL CRLF ;输入题目数
MOV W,1
MOV SI,1
begin:
RENEW1: MOV DI,W
CALL RAND ;第一个随机数
RENEW: CMP DAT1[DI],BL
JE RENEW1 ;比较随机数是否与原数组中数相等
DEC DI ;相等则再产生一个;不相等,则DI减1
JNE RENEW ;继续比较,不相等
JE NEXT ;直至DI为0,将随机数存至相应单元
NEXT: MOV DAT1[SI],BL
MOV DX,4000 ;时间延迟
AGAIN: MOV CX,65535
CXC: LOOP CXC
DEC DX
JNE AGAIN
CALL RAND ;第二个随机数
MOV DAT2,BL ;放到数组DAT2中
MOV AL,DAT1[SI] ;将第一个随机数存放到AL中
ADD1:ADD AL,DAT2 ;计算两个随机数的和
CBW ;AL-->AX
MOV RESULT,AX ;保存AX-->RESULT
CMP AX,200 ;比较结果是否>20
JG BEGIN ;大于20重新来过
JMP ADD2
ADD2:
DISPCOL 0DH,11 ;彩显算术式子
CALL SHOWQNUM ;输出题目序号
MOV BL,DAT1[SI] ;第一个随即数输出
CALL BINDEC ;二进制-->十进制
DISP1 '+' ;输出加号
JMP SHARE
SHARE: MOV BL,DAT2 ;第2个随即数输出
CALL BINDEC ;二进制-->十进制
DISP1 '=' ;输出等号
CALL DECBIN ;键盘输入十进制-->二进制
CMP RESULT,BX ;比较键盘输入和计算结果是否相等
JE TRUE
JNE WRONG
TRUE:ADD Y,1
DISP MESS2 ;输出正确提示
DISP MESS5
JMP JP1
WRONG:
DISP MESS3 ;输出错误提示
DISP MESS4 ;显示正确答案
MOV BX,RESULT
CALL BINDEC2
JP1:
CALL CRLF
CALL CRLF
INC W
INC SI
DEC COU ;计数器减1,进入下一次循环
JNE BEGIN1
MOV X,10 ;计算总分
MOV AL,Y
MOV AH,0
MUL X
PUSH AX
DISPCOLOR MESS6,LENMESS6,24,03H,1 ;输出总分提示
POP AX ;输出总分
MOV BX,AX
CALL BINDEC
CALL RETURN ;询问是否再作一遍试题
CLI ;恢复原中断
PUSH DS
MOV DX,SAVE_LC
MOV AX,SAVE_LC+2
MOV DS,AX
MOV AL,1CH
MOV AH,25H
INT 21H
POP DS
STI
RET
BEGIN1:JMP BEGIN
MAIN ENDP
;******************************************************************************************
RAND PROC
PUSH CX
PUSH DX
PUSH AX
STI
MOV AH,0 ;读时钟计数器值
INT 1AH
MOV AX,DX ;清高6位
AND AH,3
MOV DL,101 ;除101,产生0~100余数
DIV DL
MOV BL,AH ;余数存BX,作随机数
POP AX
POP DX
POP CX
RET
RAND ENDP
;******************************************************************************************
BINDEC PROC NEAR ;二进制-->十进制 (二位数)子程序
PUSH BX
PUSH CX
MOV CX,10 ;除以10
CALL DECDIV
MOV CX,1 ;除以1
CALL DECDIV
POP CX
POP BX
RET
BINDEC ENDP
;******************************************************************************************
DECDIV PROC NEAR ;二进制-->十进制(一位数)子程序
MOV AX,BX ;BX->AX,(DX,AX)作被除数,商->AX
MOV DX,0 ;DX清0,余数->DX
DIV CX ;CX存转换量级
MOV BX,DX
MOV DL,AL
ADD DL,30H
MOV AH,02 ;调用DOS(21H)2号功能
INT 21H
RET
DECDIV ENDP
;******************************************************************************************
DECBIN PROC NEAR ;十进制-->二进制子程序
MOV BX,0
NEWCHAR: MOV AH,1 ;键盘输入
INT 21H ;调用DOS(21H)1号功能
MOV DL,AL
SUB AL,30H ;ASCⅡ码-->二进制
JL EXIT ;是否<0
CMP AL,9
JG EXIT ;是否>9
CBW
XCHG AX,BX ;交换AX,BX
MOV CX,10
MUL CX
XCHG AX,BX
ADD BX,AX
JMP NEWCHAR
EXIT: RET
DECBIN ENDP
;******************************************************************************************
CRLF PROC NEAR ;回车换行子程序
MOV DL,0AH ;换行
MOV AH,02
INT 21H
MOV DL,0DH ;回车
MOV AH,02
INT 21H
RET
CRLF ENDP
;******************************************************************************************
BINDEC1 PROC NEAR ;二进制-->十进制(三位数)子程序
PUSH BX
PUSH CX
MOV CX,100
CALL DECDIV ;调用二进制->十进制(一位数)子程序
MOV CX,10
CALL DECDIV
MOV CX,1
CALL DECDIV
POP CX
POP BX
RET
BINDEC1 ENDP
;******************************************************************************************
BINDEC2 PROC NEAR ;二进制-->十进制(三位数)子程序
PUSH BX
PUSH CX
MOV CX,1000
CALL DECDIV ;调用二进制->十进制(一位数)子程序
MOV CX,100
CALL DECDIV
MOV CX,10
CALL DECDIV
MOV CX,1
CALL DECDIV
POP CX
POP BX
RET
BINDEC2 ENDP
;******************************************************************************************
RETURN PROC NEAR ;循环演练试题子程序
DISPCOLOR MESS7,LENMESS7,24,02H,1
MOV AH,01
INT 21H
CMP AL,'Y' ;输入Y或Y,再来一次
JE START1
CMP AL,'y'
JE START1
CMP AL,'N' ;输入N或N,及其他字符均返回
JE RET01
CMP AL,'n'
JE RET01
RET01:
CALL CRLF
RET
START1:JMP START
RETURN ENDP
;******************************************************************************************
SHOWQNUM PROC NEAR
DISP1 '(' ;输出左括号
ADD Z,1
MOV BX,Z ;输出题目序号
CALL BINDEC
DISP1 ')' ;输出右括号
DISP1 20H ;输出空格
RET
SHOWQNUM ENDP
;******************************************************************************************
CODE ENDS
END START
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -