鱼C论坛

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

9号中断

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

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

使用道具 举报

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

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     ;设置ds:si指向源地址
     mov di,204h            ;设置es:di指向目标地址
     mov cx,offset int9end-offset int9    ;设置cx为传输长度
     cld                ;设置传输方向为正
     rep movsb

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

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

;结束
     mov ax,4c00h
     int 21h

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

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

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

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

int9ret:pop es
     pop cx
     pop bx
     pop ax
     iret

int9end:nop

code ends

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-11-5 14:40

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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