首页 文章

为什么中断例程不停止?

提问于
浏览
-2

我正在尝试创建自定义中断...对于int 40h,int 42h,int 45h.i创建了向量设计但是在IRET指令调用之后它显示错误指令尚未定义...如何解决这个问题 . ..

我试图使用我迄今为止尝试的中断添加,减法,除法和乘法:

code segment
    assume cs:code,ds:code
    org 1000h

    mov ax,0000h
    mov ds,ax  





    mov bx,40h*4
    mov ax,offset add
    mov word ptr [bx],ax
    mov dx,0
    mov word ptr[bx+2],dx 




    mov bx,42*4
    mov ax,offset sub
    mov word ptr [bx],ax
    mov dx,0
    mov word ptr[bx+2],dx 


     mov bx,45*4
    mov ax,offset div
    mov word ptr [bx],ax
    mov dx,0
    mov word ptr[bx+2],dx


     mov bx,48*4
    mov ax,offset mul
    mov word ptr [bx],ax
    mov dx,0
    mov word ptr[bx+2],dx



    mov cx, 01h;

    cmp cx, 01h
    jz 40hh 

    cmp cx, 02h
    jz 42hhh 

    cmp cx, 03h
    jz 45hhh 

    cmp cx, 04h
    jz 48hhh 




    40hh:
    int 40h 



    42hhh:
    int 42h



    45hhh:
    int 45h 


    48hhh:
    int 48h 





    add:
    mov dl,40h
    mov dh,30h
    add dh,dl
    iret


    sub:
    mov dl,40h
    mov dh,30h
    sub dl,dh
    iret

    mul:     
    mov al,4h
    mov bh,3h
    mul bh
    iret

    div: 
    mov ax,40h
    mov cx,05h
    div cx
    iret



        e:    ret

    int 21h

1 回答

  • 1

    首先,PSP长度为256(100h)字节,而不是4KiB(1000h) .
    所以用 ORG 100h 替换 ORG 1000h .

    其次,你不能假设你的程序将被加载到一段内存中 .
    实际上你可以制作一个:它肯定会在0段加载,因为该段有一个已经拥挤的开始1 .
    然而,你这样做

    mov dx,0
    mov word ptr[bx+2],dx
    

    这将IVT条目中远指针的段部分设置为零,从而假设 addsubmuldiv 将进入段零 .
    mov dx,0 替换为 mov dx, cs .

    最后你的代码在最后运行,传递所有对中断的调用和第一个ISR本身!
    您可以使用Int 21/AH=4Ch来终止程序 .
    在退出之前,你 should 恢复原始的ISR .

    Note ,有一些代码味道 .

    您将 DS 设置为指向零段以便写入IVT条目,但是,除非您永远不会执行任何非段覆盖的内存访问,否则将其指向另一个段通常是个坏主意 .

    "switch"缺少"breaks" . 程序流的每个分支合并到下一个分支(即跳转到 40hhh 也将执行 42hh 中的代码) .

    div ISR在 div 之前未设置 dx .

    ISR本身非常随意,它们破坏了寄存器,除非这只是一个原型,它们将成为任何真实程序中使用的噩梦 .


    1如您所知,因为您正在编写位于段0开头的IVT .

相关问题