【问题标题】:How to get values used by cmp in assembly language with gdb?如何使用gdb获取cmp在汇编语言中使用的值?
【发布时间】:2013-06-27 13:07:12
【问题描述】:

我有一个程序比较两个值,我想打印它们以进行调试:

   0x00000000004005cd <+73>:    mov    DWORD PTR [rbp-0x4],eax
   0x00000000004005d0 <+76>:    mov    eax,DWORD PTR [rbp-0x4]
=> 0x00000000004005d3 <+79>:    cmp    eax,0x1e240
   0x00000000004005d8 <+84>:    jne    0x4005e6 <main+98>

所以我在 main+79 上放置了一个断点,我想打印 cmp 调用所比较的值。

如何使用 gdb 实现这一点?

感谢您的帮助。

【问题讨论】:

    标签: assembly gdb cmp


    【解决方案1】:

    CMP 不是调用 - 它是一条指令。要查看 EAX 的当前值,请使用以下命令:

    info registers eax
    

    另一个比较值是十六进制值 0x1e240。这不是一个地址,它是一个整数常量。

    【讨论】:

    • 或打印$eax。或者显示 $eax(在每一步之后打印)。
    • 据我所知,我的输入是 eax 并与 123456 (0x1e240) 进行比较。但是我的eax寄存器在我输入123的时候是41,不应该是7B吗?
    • 那么您的输入处理可能有问题。请使用输入处理代码提出另一个问题。最有可能的是,您不进行十进制到二进制的转换(atoi 的东西)。但这是另一个问题的主题。
    • 在 StackOverflow 上,我们接受答案表示感谢 :) 只是说'。
    • 我不知道评论感谢某人是否不好,但我认为感谢人们花时间帮助您解决问题是很正常的。
    【解决方案2】:

    使用 print 和/或 x(检查)命令您可以打印正在比较的值,在这种情况下您也可以只打印寄存器。

    print $eax
    info registers
    

    通过输入help x 指定检查命令的格式:

    Formats: o(octal), x(hex), d(decimal), u(unsigned decimal), t(binary), f(float), a(address), i(instruction), c(char) and s(string).
    Size letters: b(byte), h(halfword), w(word), g(giant, 8 bytes).
    

    我假设0x1e240 在这种情况下是一个地址(尽管它显然不是),假设我想打印从这个基地址开始的 4 个十六进制字。应该是:

    x[count]{format}{size} 0x1e240
    x/4xw 0x1e240
    

    另外,请记住 print 也可以使用格式说明符:

    print/{format} $eax
    print/x $eax
    

    还可以查看其他有趣的命令,例如 display

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-12-29
      • 2015-06-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-11
      • 1970-01-01
      • 2012-05-22
      相关资源
      最近更新 更多