x86汇编:如何重写中断?

问题描述 投票:0回答:1

我正在尝试将0h中断(除以零)重写为我创建的自定义标签,该标签应该打印我编写的自定义消息,而不是模拟器抛出的普通异常。

我还没有找到一个很好的资源来很好地理解所有这些内容,所以当我第一次编写它时,我的代码显然无法正常工作。我发现了这篇文章:Is it possible to make a custom Interrupt in Assembly?但我仍然感到困惑。

org 100h


jmp main


main:
    xor ax, ax
    mov es, ax    
    CLI
    mov bx, offset divideByZero
    mov es:[0h], bx 
    add bx, 2
    mov ax, cx
    mov es:[bx], ax 
    STI


    mov ax, 10
    mov bx, 0
    div bx

    mov ah, 0
    int 16h
    ret

divideByZero:
    push bp 
    mov bp, sp 

    PRINTN "Error: Divide By Zero Can Break The Universe" 

    pop bp
    iret

有人可以向我解释我如何像尝试做的那样进行自己的中断,它如何工作?

assembly x86 interrupt x86-16 emu8086
1个回答
0
投票

在设置中断向量的代码中有一些错误。 add bx,2完全没有必要,mov ax,cx应该为mov ax,csmov es:[bx],ax应该为mov es:[2],ax

一旦调用了除以零的处理程序,中断的返回地址将与刚刚出错的div指令相同。因此,当您执行iret时,您将返回到div bx并触发另一个除以零的操作。在执行iret(困难)之前,处理程序将需要中止过程(轻松)或对保存的寄存器和/或返回地址进行适当的更改。

© www.soinside.com 2019 - 2024. All rights reserved.