我只是对我用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没有。

从我的看到,所有这三个ADC操作之间的唯一区别是前两个以0xff开头并具有一个额外的“无效”字节,而第三个则没有。我假设这正在形成某种标志,以指示是否需要额外的字节。

最佳答案

这不是代码。您正在尝试反汇编数据。

如果我们将字节重新排列为4,则可以理解一下:

411548: 04 00 00 00  ; integer 4
41154C: 61 15 41 00  ; address 0x411561
411550: EC FF FF FF  ; integer 0xFFFFFFEC (-20)
411554: 04 00 00 00  ; integer 4
411558: 5C 15 41 00  ; address 0x41155C
41155C: 74 65 73 74  ; string 'test'

关于c - x86 ADC进位标志和长度,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18846483/

10-11 16:32