汇编语言——在屏幕上依次显示’A’~‘Z’,按下ESC键字符改变颜色
ASSUME CS:CODE
STACK SEGMENT
DB 128 DUP(0)
STACK ENDS
DATA SEGMENT
DW 0,0
DATA ENDS
CODE SEGMENT
START:
MOV AX,STACK
MOV SS,AX
MOV SP,128
MOV AX,DATA
MOV DS,AX
;改变中断例程入口地址
MOV AX,0
MOV ES,AX
PUSH ES:[9*4]
POP DS:[0]
PUSH ES:[9*4+2]
POP DS:[2]
MOV WORD PTR ES:[9*4],OFFSET INT9
MOV ES:[9*4+2],CS
;显示a~z
MOV AX,0B800H
MOV ES,AX
MOV AH,'A'
S:
MOV ES:[160*12+40*2],AH
CALL DELAY
INC AH
CMP AH,'Z'
JNA S
MOV AX,0
MOV ES,AX
;恢复原有地址
PUSH DS:[0]
POP ES:[9*4]
PUSH DS:[2]
POP ES:[9*4+2]
MOV AH,4CH
INT 21H
DELAY:
;延时程序
PUSH AX
PUSH DX
MOV DX,10H
MOV AX,0
S0:
ADD AX,1
SBB DX,0
CMP AX,0
JNE S0
CMP DX,0
JNE S0
POP DX
POP AX
RET
INT9:
;定义中断例程
PUSH AX
PUSH BX
PUSH ES
IN AL,60H
PUSHF
PUSHF
POP BX
AND BH,11111100B
PUSH BX
POPF
CALL DWORD PTR DS:[0]
CMP AL,1;ESC
JNE INT9RET
MOV AX,0B800H
MOV ES,AX
INC BYTE PTR ES:[160*12+40*2+1]
INT9RET:
POP ES
POP BX
POP AX
IRET
CODE ENDS
END START