我正在查看一些片段并看到这些行(.com
文件的一部分):
DB 66;
CALL D59C:C2C0;
INT 69
MOV SI, C8C6
做什么INT 69
?
我没有在网上找到任何东西,我也没有在这里找到任何东西:
奇怪的是,没有任何值移动AH
到.AL
INT 69
我正在查看一些片段并看到这些行(.com
文件的一部分):
DB 66;
CALL D59C:C2C0;
INT 69
MOV SI, C8C6
做什么INT 69
?
我没有在网上找到任何东西,我也没有在这里找到任何东西:
奇怪的是,没有任何值移动AH
到.AL
INT 69
假设这里的一切都是十六进制的,如果这是 16 位代码,那么我们有:
66 DB 66
9A C0 C2 9C D5 CALL D59C:C2C0
CD 69 INT 69
BE C6 C8 MOV SI, C8C6
但是0x66
是操作数大小覆盖前缀(可能只是在这里没有正确反汇编),它(在 16 位代码中)导致以下指令采用 32 位操作数而不是 16 位操作数。所以这段代码实际上是:
66 9A C0 C2 9C D5 CD 69 CALL 69CD:D59CC2C0
BE C6 C8 MOV SI, C8C6
从 16 位代码到一个相当随机的 16:32 位绝对地址的远调用对我来说看起来不太合理。
所以我猜这实际上是数据,而不是代码......
假设给定的代码旨在以 16 位模式执行并编码连续指令,我对它有不同的解释。
DB 66
is the operand size prefix
. In 16-bit mode it tells the CPU to interpret instruction operands as 32-bit instead of 16-bit. So, the CALL
instruction will be interpreted as CALL 16-bit selector:32-bit offset
instead of CALL 16-bit selector:16-bit offset
. The "missing" 2 bytes of the address are the INT 69
"instruction".
The effective code is then this:
CALL 69CD:D59CC2C0
MOV SI, C8C6
But that doesn't make much sense to me because a call with such an address (offset > 0FFFFh) will cause an exception. What kind of code is that?
搜索 x86 中断产生了这个列表,大概是 Ralf Brown 写的。如果这是我所相信的,那么这是一代前中断的最终清单。勾起回忆。