assembly - 是否可以在程序集中进行自定义中断?

标签 assembly x86 interrupt

在汇编语言中,我们有 DOS 中断 INT 21h,它不是硬件中断。

我想知道是否可以编写自己的中断并调用它。

如果可能,请提供链接或方法。

最佳答案

是的,您可以创建自己的中断处理程序并随时调用它。
您需要设置中断向量(从地址 0000:0000 开始)以指向您自己的中断处理程序。

指向每个处理程序的指针占用 4 个字节(偏移量和段),因此,例如,如果您想为 INT 22h 设置中断处理程序,您将更新位置 0000:0088h 处的中断向量以指向您的处理程序。

查询 Ralph Brown's interrupt list检查未使用的中断号(至少一个未被硬件中断使用的中断号)。

以下是如何为中断 22h 设置处理程序的示例:

INITIALIZE: 
      XOR AX,AX
      MOV ES,AX
      CLI ; Disable interrupts, might not be needed if seting up a software-only interrupt
      MOV WORD PTR ES:[136], OFFSET INT22  ; setups offset of handler 22h
      MOV WORD PTR ES:[138], CS            ; Here I'm assuming segment of handler is current CS
      STI ; Reenable interrupts
      ; End of setup


INT22  PROC FAR
       ; Here goes the body of your handler
       IRET
INT22  ENDP

关于assembly - 是否可以在程序集中进行自定义中断?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12464329/

相关文章:

assembly - 为什么这个 PowerPC 指令序列似乎同时设置了 cr0 和 cr1?

c - 如何定义二维数组和一维指针之间的引用,并修复 SSE2 不兼容问题?

c - 跟踪由 gcc 编译的应用程序

java - 中断长工作线程

c++ - ASSEMBLY 偏移到 C++ 代码问题

arrays - 从 gdb 中的 .bss 打印 "array"

c - 命令行参数会是 "passed twice"吗?

java - 线程interrupt()不会中断线程

ruby - 如何停止 Minitest?

java - Java字节码有 "indirect jump"吗?