鱼C论坛

 找回密码
 立即注册
查看: 2921|回复: 3

9号中断

[复制链接]
发表于 2019-5-20 23:19:14 From FishC Mobile | 显示全部楼层 |阅读模式
50鱼币
写一个中断程序当松开a键的时候屏幕上全都是a怎么写啊求代码

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

使用道具 举报

发表于 2019-5-20 23:42:48 | 显示全部楼层
就课程中的代码可以,必须在纯DOS下运行。CMD下是不可以的
  1. ;任务:安装一个新的int 9中断例程
  2. ;功能:在DOS下,按'A'键后除非不再松开,如果松开,就显示满屏幕的'A',其他键照常处理
  3. ;程序要在纯DOS下运行

  4. assume cs:code
  5. stack segment
  6.      db 128 dup (0)
  7. stack ends
  8. code segment
  9. start:   mov ax,stack
  10.      mov ss,ax
  11.      mov sp,128
  12.      push cs
  13.      pop ds
  14.      mov ax,0
  15.      mov es,ax
  16.      mov si,offset int9     ;设置ds:si指向源地址
  17.      mov di,204h            ;设置es:di指向目标地址
  18.      mov cx,offset int9end-offset int9    ;设置cx为传输长度
  19.      cld                ;设置传输方向为正
  20.      rep movsb

  21. ;将原来的int 9中断例程的入口地址保存在ds:200、ds:202单元中
  22.      push es:[9*4]
  23.      pop es:[200h]
  24.      push es:[9*4+2]
  25.      pop es:[202h]

  26. ;在中断向量表中设置新的int 9中断例程的入口地址
  27.      cli                ;设置IF=0屏蔽中断
  28.      mov word ptr es:[9*4],204h
  29.      mov word ptr es:[9*4+2],0
  30.      sti                ;设置IF=1不屏蔽中断

  31. ;结束
  32.      mov ax,4c00h
  33.      int 21h

  34. ;新的int 9中断例程
  35. int9:push ax
  36.      push bx
  37.      push cx
  38.      push es
  39.      in al,60h ;从端口60h读出键盘输入

  40. ;对int指令进行模拟,调用原来的int 9中断例程
  41.      pushf ;标志寄存器入栈
  42.      call dword ptr cs:[200h]    ;CS,IP入栈,(IP)=cs:[200h],(CS)=0;cs不一定等于0

  43. ;如果是A断码,改变当前屏幕的显示字符
  44.      cmp al,9eh             ;和A的断码(1eh+80h)比较
  45.      jne int9ret            ;不等于A时转移
  46.      mov ax,0b800h
  47.      mov es,ax
  48.      mov bx,0
  49.      mov cx,2000

  50.         s:mov byte ptr es:[bx],41h    ;将A的ASCII码写入,改变字符
  51.      add bx,2
  52.      loop s

  53. int9ret:pop es
  54.      pop cx
  55.      pop bx
  56.      pop ax
  57.      iret

  58. int9end:nop

  59. code ends

  60. end start
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2019-5-21 09:35:15 From FishC Mobile | 显示全部楼层
你怎么把原来的地址放在了es里面不是ds,为什么还要在新的int9号程序上在调用原来的int9号程序,那样cs,和IP的值不就变了么那么它又是怎么执行 后面cmp 的比较呢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-5-25 09:41:56 | 显示全部楼层
assume cs:code

stack segment
        db 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 int9                                       
        mov di,204h                                               
        mov cx,offset int9end - offset int9                
        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,4c00h
        int 21h

int9:       
        push ax
        push bx
        push cx
        push es
        
        in al,60h

        pushf        
        call dword ptr cs:[200h]                
        cmp al,9Eh                                               
        jne int9ret

        mov ax,0b800h
        mov es,ax
        mov bx,0
        mov cx,2000
   
s:      mov al,'A'
        mov byte ptr es:[bx], al
        
        ;inc byte ptr es:[bx+1]
        add bx,2
        loop s

int9ret:
        pop es
        pop cx
        pop bx
        pop ax
        iret

int9end:
        nop

code ends

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-24 00:17

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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