在屏幕中显示a-z字母,按ESC键改变字符颜色。
;程序功能:在屏幕中间同一点显示a-z的所有字符
; 1.使用cpu循环空运行实现延迟
; 2.按ESC键改变正在循环显示的字符的颜色
; 3.程序完成时,再次还原int9中断向量表
assume cs:code
data segment
db dup() data ends code segment
start:
;init ds,es
mov ax,data
mov ds,ax
mov ax,
mov es,ax ; save int9 IP and CS
mov ax,es:[*]
mov ds:[],ax
mov ax,es:[*+]
mov ds:[],ax
mov es:[*],offset int9
mov es:[*+],cs ;循环显示a-z的所有字符
mov ax,0b800h
mov es,ax
mov ah,'a'
show: mov es:[*+*],ah
call delay ;调用延迟
inc ah
cmp ah,'z'
jna show ;还原int9中断向量表
mov ax,
mov es,ax
push ds:[]
pop es:[*]
push ds:[]
pop es:[*+] mov ax,4c00h
int 21h ;使用cup循环空运行,实现延迟时间的作用
;使用32位的借位减法实现 1000 0000 0000h 次数的循环
delay:
push ax
push dx
mov dx,1000h
mov ax,
s: sub ax,
sbb dx,
cmp ax,
jne s
cmp dx,
jne s
pop dx
pop ax
ret ;实现int9中断例程
;pushf是16位,pop是16位
int9: push ax ;保存临时变量
in al,60h pushf ;用于call模拟int9后的popf操作
pushf ;用于修改IF=0、TF=0 操作
pop bx
and bh,11111100b
push bx
popf
call dword ptr ds:[]
;调用完这个模拟的int9后,会执行iret操作
;会先popf出第一次pushf的值 cmp al,
jne int9ret
add byte ptr es:[*+*+],11h
int9ret:
pop ax
iret code ends
end start
运行:我使用的是win7+masm6.15的环境,编译链接后直接debug xxx.exe,然后按g命令执行。