我正在查看一些代码段并看到这些行(.com
文件的一部分):
DB 66;
CALL D59C:C2C0;
INT 69
MOV SI, C8C6
INT 69
做了什么?
我在网上找不到任何东西,我也没有在这里找到任何东西:
奇怪的是,在AH
之前,AL
或INT 69
没有移动任何值。
EMU8086. 8086 microprocessor emulator. Integrated disassembler.
答案 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 66
是operand 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写的。如果它是我认为的那样,那就是上一代中断的明确清单。带回记忆。