[英]x86 assembly: How can i rewrite an interrupt?
我正在嘗試將 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
。
我還要提到的是,雖然原始 8086(和 EMU8086)在發生被零除(或溢出)時在除法之后推送指令的地址,但在以后的芯片上,返回地址將是與剛才相同的div
指令錯了。 因此,在這些后面的芯片上,當您執行iret
您將返回到div bx
並觸發另一個除以零。 然后處理程序要么需要中止進程(簡單),要么在執行iret
之前對保存的寄存器和/或返回地址進行適當的更改(困難)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.