小白100000000 发表于 2019-5-21 21:08:58

int 9号中断编写

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:
       pop ds:
       push es:
       pop ds:
      


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

        mov ax,0b800h
        mov es,ax
        mov ah,'a'
s:       
        moves:,ah
        call delay
        inc ah
        cmp ah,'z'
        jna s
        mov ax,0
        mov es,ax

        push ds:
        pop es:
        push ds:
        pop es:           ;将中断向量表中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:         ;对int指令进行模拟,调用原来的int 9中断例程


cmp al,1
jne int9ret
        mov ax,0b800h
        mov es,ax
        mov byte ptr es:,2
        int9ret:
        pop es
        pop bx
        pop ax
        iret

code ends

end star      为什么我按下esc建字母没有变成绿色,还有那个字母的从a到z根本没有跳,我的cpu没有那么烂吧10000次循环难道就卡住了?

暗pluto 发表于 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

暗pluto 发表于 2019-5-22 20:10:36

最后,如果对中断不太理解的话,可以看我的这篇日志
https://fishc.com.cn/blog-457197-4761.html
页: [1]
查看完整版本: int 9号中断编写