汇编语言:改变动态显示字母的颜色

动态显示字母a~z,按下 Esc 键后改变显示的颜色。

assume cs:code, ds:data, ss:stack

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 ax,4c00h
        int 21h

        ; 定义延迟程序
delay:  push ax
        push dx
        mov dx,10h
        mov ax,0
   s1:  sub ax,1
        sbb dx,0
        cmp ax,0
        jne s1
        cmp dx,0
        jne s1
        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扫描码1
        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

运行效果图:
字母会依次顺序显示,在显示过程中按Esc键会改变字母的颜色
汇编语言:改变动态显示字母的颜色_第1张图片
汇编语言:改变动态显示字母的颜色_第2张图片
汇编语言:改变动态显示字母的颜色_第3张图片

你可能感兴趣的:(汇编语言)