汇编题目:按A键,当松开的时显示字母A

安装一个新的int9中断例程,功能:在DOS下,按下“A”键后,除非不再松开,如果松开,就显示满屏的“A”;其他的按键照常处理。
提示:按下一个键时产生的扫描码称为通码,松开一个键时产生的扫描码称为断码,断码 = 通码 + 80h

我把程序改了下,按c键,在屏幕上显示B字母,程序代码如下:

;程序功能:按A键,当松开的时候在屏幕的80*25的里面全部显示字母A,不松开则不作任何处理,其他的键照常处理。

assume cs:code
data segment
db 100 dup(0)

data ends

code segment
start:    
    mov ax,0
    mov es,ax
    mov di,200h
    mov ds,ax
    mov si,[9*4]
    mov cx,4
    cld
    rep movsb
    
    mov ax,offset int9
    mov ds:[9*4],ax
    mov ax,cs
    mov ds:[9*4+2],ax
    
    call breakPoint

    ;还原int9中断向量表
    mov ax,0
    mov ds,ax
    mov si,200h
    mov di,9*4
    mov cx,4
    cld
    rep movsb
    
    
    mov ax,4c00h
    int 21h



;实现int9中断例程
int9:
    cli
    push ax
    mov ax,0b800h
    push es
    mov es,ax
    
    push bx
    mov bx,0
    
    push cx
    mov cx,2000
    
    in al,60h
    cmp al,2eh+80h
    jne int9ret
    mov ah,'B'
    s0:
    mov byte ptr es:[bx],ah
    add bx,2
    loop s0
    
    int9ret:
    int 80h
    pop cx
    pop bx
    pop es
    pop ax
    iret


breakPoint:
    push ax
    pushf
    pop ax
    or ah,3        ;这里可以增加判断,例:当cx为100的时候再设置断点
    push ax
    popf
    pop ax
    ret

code ends
end start

运行:我使用的是win7+masm6.15环境,通过编译、链接后,使用debug xxx.exe的形式运行,直接按g命令,则会执行到断点处call breakPoint,这时候你按c键盘,就可以在屏幕上显示B字母了。

posted on 2016-01-25 15:25  jack_Meng  阅读(728)  评论(0编辑  收藏  举报

导航