c - x86 ADC 进位标志和长度

标签 c assembly x86 intel

我只是对我用 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 指令。根据我在 Intel 开发人员手册和 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 开头并有一个额外的“无效”字节,而第三个则没有。我假设这是在形成某种标志以指示是否需要额外的字节。

最佳答案

这不是代码。您正在尝试分解数据。

如果我们重新排列对齐到 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/

相关文章:

c - 使用指向外部变量的指针进行静态初始化

c - PIC 16F1788读取电压

linux - 我可以将一个寄存器的值乘以一个立即数以将结果添加到另一个寄存器吗?

linux - nasm x86 初学者使用 C 调用 - printf scanf

c - 如何使用格式说明符检索当前目录之外的文件?

c - `close()` 是否刷新缓冲输出数据?

assembly - IN(以及 INS、INSB 等)指令可以在 x86 汇编中 block 吗?

assembly - 支持 AVX2 的处理器上的非法指令 vgatherdps

assembly - 何时在 MASM 中将 EXTERNDEF 与 ABS 一起使用?

assembly - X86 编码近调用相对偏移量