【问题标题】:x86 cmp Opcode, Pointers and Inline Literalsx86 cmp 操作码、指针和内联文字
【发布时间】:2012-01-22 21:59:45
【问题描述】:

我正在使用 gdb 检查程序。在汇编中,代码是这样做的:

cmp $0x5, %eax

但是,当我检查 %eax 的内容时,我得到:\020\343\377\377\377\177 当作为字符串检查时。

\020\343\377\377\377\177 在汇编中与 $0x5 相比如何?

【问题讨论】:

  • “%eax 的内容”是什么意思?作为字符串检查?寄存器不能保存 C 意义上的任何有意义的字符串。
  • 这是一个相当广泛的eax。
  • 通过调用类似的东西检查它:x/30s $eax
  • 好的,所以您取消引用 %eax 作为获取该数据的指针。这与cmp 无关。现在写答案...

标签: assembly x86 cmp


【解决方案1】:

cmp,在这种情况下,将eax 中的值与常量5 进行比较。 eax 所指向的值,如果你认为它实际上是一个指针,则根本不与常量进行比较。

比较是通过减法完成的 - 在您的情况下,这意味着从 eax 中的值中减去 5,以及几个标志(CF、OF、SF、ZF、AF 和 PF,根据 @ 987654321@) 设置得当。通常cmp 指令后跟某种条件指令(通常是跳转),根据比较结果执行不同的操作。

如果您告诉我们eax 中的值,而不是将eax 解释为指针,我或许可以为您提供更多信息。您可以使用p $eaxinfo registers 来获取gdb 中eax 的值。

【讨论】:

  • 运行 p $eax 时,我得到:6307568。很抱歉,x/30s $eaxp $eax 有什么区别?
  • p $eax 显示eax 中的值。 x/30s $eax 使用 eax 作为指针,取消引用它,并将结果显示为字符串。检查 xp 的 gdb 文档。
  • 仅供大家日后参考,这里是他们俩的gdb aproposx -- Examine memory: x/FMT ADDRESSp -- Print value of expression EXP
猜你喜欢
  • 1970-01-01
  • 2020-04-12
  • 2022-11-23
  • 2011-01-29
  • 1970-01-01
  • 2017-09-24
  • 2012-08-25
  • 2012-01-12
  • 2021-11-04
相关资源
最近更新 更多