簡體   English   中英

x86 程序集:如何重寫中斷?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM