您的位置:首页 > 其它

汇编实验 固定时间改变背景色及字符位置

2016-05-12 22:25 441 查看
题目:在屏幕上显示一个“*”字符。要求背景颜色不断改变(间隔0.5 秒),且“*”字符可在屏幕上无规则移动(速度0.1 秒)。

用中断来控制时间间隔。写的心好累。。。。然而这个随机数的生成好像根据个人电脑的情况不同,我的电脑好像挺有规律的。。。

RAND MACRO N            ;通过中断,获取返回在N内的随机数
MOV     AH,0
INT     1AH
MOV     AX,DX
AND     AH,3
MOV     DL,N
DIV     DL          ;余数存在AH中,即随机数
ENDM

STACKSG     SEGMENT   STACK  'S'
DW 64 DUP('ST')
STACKSG     ENDS

DATA        SEGMENT
CHAR DB '*'         ;输出的字符
COUNT     DW    1   ;中断调用时间间隔(0.1秒)
N         DW    1   ;控制屏幕变换时间间隔(0.5秒)
COLOR       DB  0FH ;上一帧屏幕颜色
DATA        ENDS

CODE        SEGMENT
ASSUME   CS:CODE , DS:DATA , SS:STACKSG
MAIN    PROC    FAR
MOV     AX, DATA
MOV     DS, AX
MOV     ES, AX

MOV     AH, 0       ;置显示模式为80*25彩色文本方式
MOV     AL, 3
INT     10H

MOV     AH,35H      ;取原1CH中断向量
MOV     AL,1CH
INT     21H

PUSH    ES          ;保存原1CH中断向量
PUSH    BX

PUSH    DS
MOV     DX,SEG INTERUPT1
MOV     DS,DX
LEA     DX,INTERUPT1

MOV     AH,25H        ;设置新1CH中断向量
MOV     AL,1CH
INT     21H
POP     DS

MOV     AH, 0           ;等待按任意键
INT     16H
EXIT0:
POP     DX              ;恢复1CH中断向量
POP     DS
MOV     AH,25H
MOV     AL,1CH
INT     21H

MOV     AH,6            ;以黑底白字清屏
MOV     AL,0
MOV     BH,07H
MOV     CX,0
MOV     DX,184FH
INT     10H

MOV     AX,4C00H        ;返回操作系统
INT     21H
MAIN        ENDP

INTERUPT1 PROC  FAR         ;新1CH中断处理子程序
PUSH    AX              ;保存寄存器
PUSH    BX
PUSH    CX
PUSH    DX
PUSH    DS

STI                     ;开中断
MOV     AX,DATA
MOV     DS,AX

DEC     COUNT
JNZ     EXIT

STI
;--------------------------------------
MOV     AX,N
CMP     AX,6
JNL     CHANGE          ;判断是否已到0.5秒的周期,若到则屏幕改变颜色,否则屏幕颜色不变
NOTCHANGE:
INC     AX
MOV     N,AX
MOV     BH,COLOR
JMP     CONTINUE
CHANGE:

RAND 8                  ;随机数存在AH中
MOV     BH,AH

MOV     CL,4
SAL     BH,CL
ADD     BH,0FH

MOV     COLOR,BH

MOV     AX,0
MOV     N,AX

JMP     CONTINUE

CONTINUE:
MOV AH, 6               ;清全屏
MOV AL, 0
MOV CX, 0
MOV DX, 184FH
INT 10H                 ;设置屏幕颜色

RAND 80                 ;光标横坐标
MOV     BL,AH

RAND 25                 ;光标纵坐标
MOV     BH,AH
MOV     DX,BX

MOV AH ,2               ;设置光标位置
MOV BH ,0
INT 10H

MOV AH , 2
MOV DL , CHAR           ;输出字符‘*’
INT 21H
;--------------------------------------
MOV COUNT,2             ;0.1秒计数值重新初始化
EXIT:
CLI                     ;关中断

POP DS
POP DX
POP CX
POP BX
POP AX                  ;恢复寄存器

IRET                    ;中断返回
INTERUPT1  ENDP

CODE        ENDS
END     MAIN
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: