鱼C论坛

 找回密码
 立即注册
查看: 2564|回复: 2

int 9号中断编写

[复制链接]
发表于 2019-5-21 21:08:58 | 显示全部楼层 |阅读模式

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

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

x
assume cs:code,ss:stack
stack segment
db 128 dup(0)
stack ends
data segment
dw 0,0
data ends

code segment
star:mov ax,stack
     mov ss,ax
         mov sp,128
     mov ax,0
         mov es,ax
         mov ax,data
         mov dx,ax
         push es:[9*4]
         pop ds:[0]
         push es:[9*4+2]
         pop ds:[2]
      


mov word ptr es:[9*4],offset int9
        mov es:[9*4+2],cs        ;在中断向量表中设置新的int 9中断例程的入口地址

        mov ax,0b800h
        mov es,ax
        mov ah,'a'
s:       
        mov  es:[160*12+40*2],ah
        call delay
        inc ah
        cmp ah,'z'
        jna s
        mov ax,0
        mov es,ax

        push ds:[0]
        pop es:[9*4]
        push ds:[2]
        pop es:[9*4+2]           ;将中断向量表中int 9中断例程的入口恢复为原来的地址

        mov ax,4c00h
        int 21h

delay:       
        push ax
        push dx
        mov dx,2000h
        mov ax,0
s1:        
        sub ax,1
        sbb dx,0
        cmp ax,0
        jne s1
        cmp dx,0
        jne s1
        pop dx
        pop ax
        ret
int9:
    push ax
        push bx
        push es


        in al,60h

        pushf
        pushf
        pop bx
        and bh,11111100b
        push bx
        popf
        call dword ptr ds:[0]         ;对int指令进行模拟,调用原来的int 9中断例程


cmp al,1
jne int9ret
        mov ax,0b800h
        mov es,ax
        mov byte ptr es:[60*12+40*2+1],2
        int9ret:
        pop es
        pop bx
        pop ax
        iret

code ends

end star        为什么我按下esc建字母没有变成绿色,还有那个字母的从a到z根本没有跳,我的cpu没有那么烂吧10000次循环难道就卡住了?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-5-22 20:09:53 | 显示全部楼层
第一,你或许不太了解到底循环了多少次
我帮你算一下吧,你在delay里面的dx设为了2000h
循环了2000h*10000h = ‭20000000‬h = ‭536870912‬次  也就是5亿多次,你觉得你电脑吃得消吗?
至于怎么来的?
这循环的意思是说,每次把ax减一,dx减(0+进位标志器的数)
一开始,ax是0,减一以后就是ffffh,dx减(0+1),dx变为1fffh,然后看ax是不是等于0,不是,那ax继续减一,dx减(0+进位标志)(这时的进位标志为0)
若ax等于0,那么比较dx,是不是等于0,不是,继续循环
这就相当于循环2000h*10000h

第二,你代码都打错了,最后倒数第八行,你用mov的话代表颜色就只有2那个颜色,而且,后面的地址也错了,应该是160*12+40*2+1
你可以改成inc或add

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

使用道具 举报

发表于 2019-5-22 20:10:36 | 显示全部楼层
最后,如果对中断不太理解的话,可以看我的这篇日志
https://fishc.com.cn/blog-457197-4761.html
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-7-5 10:30

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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