为什么中断例程不停止?

时间:2016-07-24 10:05:58

标签: assembly x86 interrupt x86-16

我正在尝试创建自定义中断...对于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 个答案:

答案 0 :(得分:1)

首先,PSP长度为256(100h)字节,而不是4KiB(1000h)。
因此,请将ORG 1000h替换为ORG 100h

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

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

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

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

注意,有一些代码味道。

您设置DS指向段零以编写IVT条目,但是,除非您永远不会执行任何非段覆盖的内存访问,否则它指向另一个段通常是馊主意。

“开关”缺少“休息”。程序流的每个分支合并为下一个分支(即跳转到40hhh也将执行42hh的代码。)

div ISR未在dx之前设置div

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

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