我只是对我用 C 编写的一个反汇编的 32 位程序进行一些分析。下面是反汇编程序的一部分输出:
41153c 02 00 add al, [eax]
41153e 00 00 add [eax], al
411540 44 inc esp
411541 15 41 00 F8 FF adc eax, 0xfff80041 ; "A"
411546 FF invalid
我只是想理解 ADC 指令。根据我在英特尔开发人员手册和 x86 ASM 上的各种文章中阅读的内容,操作码 0x15 是使用 EAX 作为目标的 ADC 指令,并且看起来在操作码之后是一个四字节的“立即”,表示用于带进位的加法的内存地址。
但是我有点不确定为什么以下字节(0xFF)被标记为无效。
我对汇编程序很陌生,但我假设这与进位标志有关,并且可能在那里签署扩展值。
我使用了两个单独的反汇编程序来查看代码,其中一个将其标记为无效,而另一个则简单地忽略它。
如果有人可以提供一些建议,我将不胜感激。
谢谢
更新
我将在这篇文章中添加更多信息,因为还有另外两个 ADC 操作,其中一个没有额外的“无效”字节
411547 FF 04 00 inc [eax+eax]
41154a 00 00 add [eax], al
41154c 61 popa
41154d 15 41 00 EC FF adc eax, 0xffec0041 ; "A"
411552 FF invalid
411553 FF 04 00 inc [eax+eax]
411556 00 00 add [eax], al
411558 5C pop esp
411559 15 41 00 74 65 adc eax, 0x65740041 ; "A"
41155e 73 74 jnc 0x4115d4 ↓
发生的第二个 ADC 也有额外的 0xff“无效”字节,但第三个没有。
据我所知,所有三个 ADC 操作之间的唯一区别是前两个操作以 0xff 开头并有一个额外的“无效”字节,而第三个则没有。我假设这正在形成某种标志来指示是否需要额外的字节。