在汇编中更改中断时...?

when changing interrupt in assembly...?

我刚刚读了 7 年前的另一个问题...我试图改变被零除的中断,所以我写了一个函数来处理除法本身,但我不明白为什么在设置中断时我需要写我需要将 es:[2] 设置为 cs,为什么它是 2 而不是 4,为什么是 cs 而不是 ip,有人可以解释这一行吗? (MOV ES:[2], cs)

XOR ax, ax
mov ax, 0h
mov es, ax
mov es:[0], offset INT0h ; putting my function's ptr in the first int (for division by zero)
MOV ES:[2], cs           ; Here I'm assuming segment of handler is current CS
; End of setup


mov ax, 15
mov cx, 0
div cx

mov ah, 0
int 16h
ret




INT0h  PROC DivisionByZero
PRINT "ERROR: division by zero!"
IRET
INT0h  ENDP DivisionByZero

在实地址模式下,256个中断向量都是远指针。 一个远指针由一个16位的偏移量和一个16位的段值组成。

当我们谈论远指针时,我们首先提到段,然后是冒号,我们提到偏移量。例如CS:IPDS:SI

由于x86是小端架构,当在内存中存储一个远指针时,我们首先存储最低有效部分,即偏移量,然后是最高有效部分,即偏移量是段。

因为 DivisionByZero 中断向量是中断向量中的第一个 table 从内存的第一个地址开始,你会发现它的远指针位于 0 到 3 的地址范围内。

偏移量指向地址 0 和 1。
该段转到地址 2 和 3。