首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >x86程序集:如何重写中断?

x86程序集:如何重写中断?
EN

Stack Overflow用户
提问于 2019-12-09 01:12:52
回答 1查看 710关注 0票数 0

我正在尝试将0h中断(除以0)重写为我制作的自定义标签,它将打印我制作的自定义消息,而不是仿真器抛出的普通异常。

我还没有找到一个好的源代码来以一种好的和容易理解的方式解释所有这些东西,所以我的代码显然在我第一次编写它的时候不能工作。我找到了这个帖子:Is it possible to make a custom Interrupt in Assembly?,但我还是很困惑。

代码语言:javascript
运行
复制
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

有没有人能给我解释一下,我怎样才能像我试图做的那样中断自己,以及它是如何工作的?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-12-09 05:42:54

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

我还会提到,虽然最初的8086 (和EMU8086)在被零除(或溢出)发生时会在除法后推入指令的地址,但在后来的芯片上,返回地址将与刚刚出错的div指令相同。因此,在这些后面的芯片上,当您执行iret时,您将返回到div bx,并触发另一个除法为零。则处理程序需要在执行iret之前中止进程(容易),或者对保存的寄存器和/或返回地址进行适当的更改(困难)。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59237825

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档