0

我正在查看一些片段并看到这些行(.com文件的一部分):

  DB 66; 
  CALL D59C:C2C0; 
  INT 69
  MOV SI, C8C6

做什么INT 69

我没有在网上找到任何东西,我也没有在这里找到任何东西:

奇怪的是,没有任何值移动AH到.ALINT 69

动车组8086。8086微处理器仿真器。集成拆卸器。

4

3 回答 3

9

假设这里的一切都是十六进制的,如果这是 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 位绝对地址的远调用对我来说看起来不太合理。

所以我猜这实际上是数据,而不是代码......

于 2011-11-16T00:49:47.443 回答
3

假设给定的代码旨在以 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?

于 2011-11-16T00:53:31.670 回答
2

搜索 x86 中断产生了这个列表,大概是 Ralf Brown 写的。如果这是我所相信的,那么这是一代前中断的最终清单。勾起回忆。

于 2011-11-15T23:28:08.363 回答