qnapjiujiu 发表于 2014-12-16 20:32:40

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

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:
      pop es:
      push es:
      pop es:
         
      cli
      mov word ptr es:,204h
      mov word ptr es:,0
      sti
         
      mov ax,0b800h
      mov es,ax
      mov byte ptr es:,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:;调用原来的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
      je s8
      inc bx
      jmp s9
      s8:
      mov al,table0      
      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
   
    jmpfar 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:,' '
      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:,11111000b
      or es:,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:,10001111b
      or es:,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 ,' '
      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   
   
    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和table0用的对吗?
请大家帮我看看,谢谢

lqjstc 发表于 2014-12-25 17:35:52

MARK一个,课本里的9号中断我都还没搞清楚。楼主已经大大扩展了这个程序的用途。坐等牛人。
页: [1]
查看完整版本: 新的int9中断程序,按键通码和数字对应的问题