我只是对我用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开始并且有一个额外的'无效'字节,而第三个没有。我假设这正在形成某种标志,以指示是否需要额外的字节。
答案 0 :(得分:3)
这不是代码。你正试图反汇编数据。
如果我们重新排列对齐到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'