我正在尝试将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
有人可以向我解释我如何像尝试做的那样进行自己的中断,它如何工作?
在设置中断向量的代码中有一些错误。 add bx,2
完全没有必要,mov ax,cx
应该为mov ax,cs
,mov es:[bx],ax
应该为mov es:[2],ax
。
一旦调用了除以零的处理程序,中断的返回地址将与刚刚出错的div
指令相同。因此,当您执行iret
时,您将返回到div bx
并触发另一个除以零的操作。在执行iret
(困难)之前,处理程序将需要中止过程(轻松)或对保存的寄存器和/或返回地址进行适当的更改。