您的位置:首页 > 其它

汇编题目:在屏幕中间显示a-z的所有字母,按ESC键改变字符颜色

2016-01-25 13:51 393 查看
在屏幕中显示a-z字母,按ESC键改变字符颜色。

;程序功能:在屏幕中间同一点显示a-z的所有字符
;        1.使用cpu循环空运行实现延迟
;        2.按ESC键改变正在循环显示的字符的颜色
;        3.程序完成时,再次还原int9中断向量表
assume cs:code
data segment
db 100 dup(0)

data ends

code segment
start:
;init ds,es
mov ax,data
mov ds,ax
mov ax,0
mov es,ax

; save int9 IP and CS
mov ax,es:[9*4]
mov ds:[0],ax
mov ax,es:[9*4+2]
mov ds:[2],ax
mov es:[9*4],offset int9
mov es:[9*4+2],cs

;循环显示a-z的所有字符
mov ax,0b800h
mov es,ax
mov ah,'a'
show: mov es:[160*12+40*2],ah
call delay    ;调用延迟
inc ah
cmp ah,'z'
jna show

;还原int9中断向量表
mov ax,0
mov es,ax
push ds:[0]
pop es:[9*4]
push ds:[2]
pop es:[9*4+2]

mov ax,4c00h
int 21h

;使用cup循环空运行,实现延迟时间的作用
;使用32位的借位减法实现 1000 0000 0000h 次数的循环
delay:
push ax
push dx
mov dx,1000h
mov ax,0
s: sub ax,1
sbb dx,0
cmp ax,0
jne s
cmp dx,0
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:[0]
;调用完这个模拟的int9后,会执行iret操作
;会先popf出第一次pushf的值

cmp al,1
jne int9ret
add byte ptr es:[160*12+40*2+1],11h
int9ret:
pop ax
iret

code ends
end start


运行:我使用的是win7+masm6.15的环境,编译链接后直接debug xxx.exe,然后按g命令执行。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: