鱼C论坛

 找回密码
 立即注册
查看: 1530|回复: 1

新的int9中断程序,按键通码和数字对应的问题

[复制链接]
发表于 2014-12-16 20:32:40 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
assume cs:code

stack segment
    dw 128 dup (0)
stack ends

code segment
start:   
        mov ax,stack
        mov ss,ax
        mov sp,128
         
        push cs
        pop ds
         
        mov ax,0
        mov es,ax
         
        mov si,offset setscreen
        mov di,204h
        mov cx,offset setscreenend-offset setscreen
        cld
        rep movsb
         
        push es:[9*4]
        pop es:[200h]
        push es:[9*4+2]
        pop es:[202h]
         
        cli
        mov word ptr es:[9*4],204h
        mov word ptr es:[9*4+2],0
        sti
         
        mov ax,0b800h
        mov es,ax
        mov byte ptr es:[160*8+50],35h
        s1:
            mov cx,0   
            loop s1

    mov ax,4c00h
    int 21h
     
    setscreen:
        push ax
        push bx
        push cx
        push es
        in al,60h
        pushf
        call dword ptr cs:[200h];调用原来的int9中断
         
        cmp al,0bh;//判断方法1
        ja set
        cmp al,2;扫描到的按键值大于b或小于2都跳到set
        jb set
        table0 db 0,1,2,3;对应0,1,2,3
        table1 db 0bh,2,3,4;0,1,2,3的案件通码
        push bx
        mov bx,0
        s9:cmp al,table1[bx]
        je s8
        inc bx
        jmp s9
        s8:
        mov al,table0[bx]      
        pop bx ;//判断方法1
         
        ;cmp al,0bh;//判断方法2
        ;ja set
        ;cmp al,2;扫描到的按键值大于b或小于2都跳到set
        ;jb set
        ;cmp al,0bh
        ;je e0
        ;jb e1
        ;e0:mov al,0
        ;jmp short e2;当判断出是‘0’按键时跳过dec al,跳到e2
        ;e1:dec al;当判断出是'1,2,3'按键时自动减1使al值对应按键值
                ;//判断方法2
                 
        e2:mov ah,al      
        mov al,2
     
    jmp  far ptr set
        table dw sub1,sub2,sub3,sub4
    sub1:push bx;清屏
        push cx
        push es
        mov bx,0b800h
        mov es,bx
        mov bx,0
        mov cx,2000
    sub1s:mov byte ptr es:[bx],' '
        add bx,2
        loop sub1s
        pop es
        pop cx
        pop bx
        ret
         
    sub2:push bx;设置前景颜色
        push cx
        push es
        mov bx,0b800h
        mov es,bx
        mov bx,1
        mov cx,2000
    sub2s:and byte ptr es:[bx],11111000b
        or es:[bx],al
        add bx,2
        loop sub2s
         
        pop es
        pop cx
        pop bx
        ret
         
    sub3:push bx;设置背景颜色
        push cx
        push es
        mov cl,4
        shl al,cl
        mov bx,0b800h
        mov es,bx
        mov bx,1
        mov cx,2000
    sub3s:and byte ptr es:[bx],10001111b
        or es:[bx],al
        add bx,2
        loop sub3s
        pop es
        pop cx
        pop bx
        ret
         
    sub4:push cx;向上滚一行
        push si
        push di
        push es
        push ds
         
        mov si,0b800h
        mov es,si
        mov ds,si
        mov si,160
        mov di,0
        cld
        mov cx,24
    sub4s:push cx
        mov cx,160
        rep movsb
        pop cx
        loop sub4s
         
        mov cx,80
        mov si,0
    sub4s1:mov byte ptr [160*24+si],' '
        add si,2
        loop sub4s1
         
        pop ds
        pop es
        pop di
        pop si
        pop cx
        ret
         
    set:push bx
        cmp ah,3
        ja sret
        mov bl,ah
        mov bh,0
        add bx,bx;选择程序
         
    call word ptr table[bx]   
     
    sret:pop bx
        pop es
        pop cx
        pop bx
        pop ax
        iret
     
    setscreenend:nop
code ends
end start
这个程序要实现的功能是运行程序后,按0键 清屏,按1键设置前景色为绿色,按2键设置背景色为绿色,按3键向上滚动一行。
红色的部分为第2个方法,可以实现功能。紫色的部分为第1个方法,第1个方法无法实现:按0~9都清屏,这是怎么回事呢?table0 db 0,1,2,3   table1 db 0bh,2,3,4这是不是没起作用呢?table1[bx]和table0[bx]用的对吗?
请大家帮我看看,谢谢


想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-12-25 17:35:52 | 显示全部楼层
MARK一个,课本里的9号中断我都还没搞清楚。楼主已经大大扩展了这个程序的用途。坐等牛人。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-10-7 00:13

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表