【问题标题】:x86 ADC carry flag and lengthx86 ADC 进位标志和长度
【发布时间】:2013-09-17 09:45:24
【问题描述】:

我只是对我用 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 开头并有一个额外的“无效”字节,而第三个则没有。我假设这正在形成某种标志来指示是否需要额外的字节。

【问题讨论】:

  • 生成这个的 C 代码部分是什么?
  • 不幸的是,我面前没有代码。我在我目前在家工作时无法访问的系统上编写了它。一旦我可以访问代码,我会在这里发布。谢谢。
  • “杂散”0xFF 字节之后是什么?它是否构成有效指令?
  • 紧跟在 0xff 之后的是另一个 0xff,它是有效指令的开始。例如,0x411546 处的第一个是无效的,但是 0x411547 处是操作码 ff0400,它是一条 INC 指令。
  • 您确定您的拆卸正确吗? x86 具有可变长度指令,当您在指令中开始反汇编时,您可能会得到一些看似正确反汇编但实际上没有任何意义或实际执行的东西。您在此处发布的代码看起来就像那样。这不是编译器会生成的代码,随机弹出和“inc esp”肯定看起来很可疑。你从哪个偏移量开始拆卸?

标签: c assembly x86 intel


【解决方案1】:

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

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

【讨论】:

  • 嗯,这当然很有趣!反汇编程序声明这些指令在 PE 文件的 .text 部分中,我相当确定它实际上不应该包含任何数据......
  • @tony 一些编译器将只读数据放入没有只读数据特殊部分的系统上的文本中。
  • 啊,好的,谢谢。那么这是否意味着我使用的反汇编程序在这种情况下出错了?如果是这样,您能推荐一个我可以使用的反汇编程序吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-08
  • 1970-01-01
  • 2012-10-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多