我正在尝试将0h中断(除以0)重写为我制作的自定义标签,它将打印我制作的自定义消息,而不是仿真器抛出的普通异常。
我还没有找到一个好的源代码来以一种好的和容易理解的方式解释所有这些东西,所以我的代码显然在我第一次编写它的时候不能工作。我找到了这个帖子: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
有没有人能给我解释一下,我怎样才能像我试图做的那样中断自己,以及它是如何工作的?
发布于 2019-12-08 21:42:54
在您设置中断向量的代码中有一些错误。add bx,2
完全没有必要,mov ax,cx
应该是mov ax,cs
,mov es:[bx],ax
应该是mov es:[2],ax
。
我还会提到,虽然最初的8086 (和EMU8086)在被零除(或溢出)发生时会在除法后推入指令的地址,但在后来的芯片上,返回地址将与刚刚出错的div
指令相同。因此,在这些后面的芯片上,当您执行iret
时,您将返回到div bx
,并触发另一个除法为零。则处理程序需要在执行iret
之前中止进程(容易),或者对保存的寄存器和/或返回地址进行适当的更改(困难)。
https://stackoverflow.com/questions/59237825
复制相似问题