在汇编中更改中断时...?
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:IP
、DS:SI
由于x86是小端架构,当在内存中存储一个远指针时,我们首先存储最低有效部分,即偏移量,然后是最高有效部分,即偏移量是段。
因为 DivisionByZero 中断向量是中断向量中的第一个 table 从内存的第一个地址开始,你会发现它的远指针位于 0 到 3 的地址范围内。
偏移量指向地址 0 和 1。
该段转到地址 2 和 3。
我刚刚读了 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:IP
、DS:SI
由于x86是小端架构,当在内存中存储一个远指针时,我们首先存储最低有效部分,即偏移量,然后是最高有效部分,即偏移量是段。
因为 DivisionByZero 中断向量是中断向量中的第一个 table 从内存的第一个地址开始,你会发现它的远指针位于 0 到 3 的地址范围内。
偏移量指向地址 0 和 1。
该段转到地址 2 和 3。