什么是x86 16位汇编语言中的中断69?

时间:2011-11-15 23:24:05

标签: assembly windows-xp x86 x86-16

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

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

INT 69做了什么?

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

奇怪的是,在AH之前,ALINT 69没有移动任何值。

EMU8086. 8086 microprocessor emulator. Integrated disassembler.

3 个答案:

答案 0 :(得分: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位绝对地址对我来说看起来不太合理。

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

答案 1 :(得分:3)

假设给定代码是以16位模式执行并编码连续指令,我对它有不同的解释。

DB 66operand size prefix。在16位模式下,它告诉CPU将指令操作数解释为32位而不是16位。因此,CALL指令将被解释为CALL 16-bit selector:32-bit offset而不是CALL 16-bit selector:16-bit offset。地址的“缺失”2个字节是INT 69“指令”。

有效的代码是这样的:

CALL 69CD:D59CC2C0
MOV SI, C8C6

但这对我来说没有多大意义,因为具有这样一个地址(offset> 0FFFFh)的调用将导致异常。这是什么类型的代码?

答案 2 :(得分:2)

搜索x86中断产生了this list,大概是由一个Ralf Brown写的。如果它是我认为的那样,那就是上一代中断的明确清单。带回记忆。