📄 112.asm
字号:
data SEGMENT
data ENDS
stack1 SEGMENT para stack
stack1 ENDS
code SEGMENT
ASSUME CS:code,DS:data,ES:data,SS:stack1
ORG 100h
start:
PUSH AX
PUSH BX
PUSH CX
PUSH DX
PUSH SI
PUSH DI
MOV CL,74h ;设成灰底白字
MOV DI,0
MOV BX,0
MOV DX,0b800h ;显示缓冲区启始段地址b800h
MOV DS,DX
qingping: ;清屏幕
MOV AL,20h
MOV DS:[BX],AL
ADD BX,1
MOV AL,CL
MOV DS:[BX],AL
;add cl,1 ;此语句可实现16色背景
ADD BX,1
CMP BX,1000h
JZ beifenkeyint
;JMP tianchong
beifenkeyint: ;备份键盘中断转向(向量)地址
MOV AX,0
MOV DS,AX
MOV AX,WORD PTR DS:[24h]
MOV WORD PTR CS:[1a0h],AX
MOV AX,WORD PTR DS:[26h]
MOV WORD PTR CS:[1a2h],AX
;重新设置键盘中断转向(向量)地址
CLI
MOV AX,0adh
OUT 64h,AX
MOV AX,200h
MOV WORD PTR DS:[24h],AX
MOV AX,CS
MOV WORD PTR DS:[26h],AX
MOV AX,ES
MOV DS,AX
MOV AX,0aeh
OUT 64h,AX
STI
keyWAIT: ;等待键盘输入
NOP
STI
NOP
MOV AL,ES:[1a4h] ;检测ESC键
CMP AL,1
JZ exit ;ESC键按下则退出
NOP
NOP
mov al,20h
out 20h,al
JMP keyWAIT
EXIT: ;准备退出程序并恢复键盘中断转向(向量)地址
CLI
MOV AX,0adh
OUT 64h,AX
MOV AX,0
MOV DS,AX
MOV AX,WORD PTR ES:[1a0h]
MOV WORD PTR DS:[24h],AX
MOV AX,WORD PTR ES:[1a2h]
MOV WORD PTR DS:[26h],AX
MOV AX,ES
MOV DS,AX
MOV AX,0aeh
OUT 64h,AX
POP DI
POP SI
POP DX
POP CX
POP BX
POP AX
STI
INT 20h
ORG start+0a0h
c1 DB 10h DUP(?) ;建立临时数据存储区
ORG start+100h
keyint9: ;键盘中断9处理程序
; 取键盘缓冲区状态
CLI
MOV AL,0
MOV ES:[1a4h],AL
IN AL,64h
AND AL,3
ADD AL,30h
MOV DL,AL
CALL xianshi
;读取键盘扫描码
IN AL,60h
MOV ES:[1a4h],AL
;显示AL的高4位16进制代码
MOV BL,AL
MOV CL,4
ROR AL,CL
AND AL,0fh
CALL bijiao
CALL xianshi
;显示AL的低4位16进制代码
MOV AL,BL
AND AL,0fh
CALL bijiao
CALL xianshi
; 再次读取键盘缓冲区状态
IN AL,64h
AND AL,3
ADD AL,30h
CALL xianshi
IRET ;键盘中断返回
bijiao:
CMP AL,9
JG jia41h
ADD AL,30H
RET
jia41h:
SUB AL,0ah
ADD AL,41h
RET
xianshi:
PUSH DS
PUSH AX
MOV AX,0b800h
MOV DS,AX
CMP DI,1000h
;JZ exitxianshi
POP AX
MOV DS:[DI],AL
ADD DI,2
POP DS
RET
code ENDS
END start
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -