【问题标题】:Figure out number of commands from assembly form从汇编表单中找出命令的数量
【发布时间】:2018-05-01 20:34:37
【问题描述】:

我有一个 C 文件,我将它转换为汇编形式,我想知道使用 gdb 和汇编文件在主函数上有多少指令。我该怎么做?

【问题讨论】:

  • 请在问题中发布更多细节,这没有多大意义。
  • 我想我的意思是“说明”,我的术语不是很好。重点是,我正在做的练习说我应该使用“x/??i *main”命令,然后计算在 main 上有多少指令
  • 仍然比泥巴更清晰。请提出正确的问题。
  • 如果没有具体的例子,这个问题真的无法回答。另外,“多少条指令”是什么意思?比如在运行期间执行了多少,或者代码中有多少?优化编译器可能会展开循环以提高速度,即使它看起来像是“更多指令”。
  • 编译然后手动反汇编和计数。了解不同的编译器或同一编译器的不同版本以及编译器设置/选项可以/将给出截然不同的结果,同时仍提供功能正确的代码。 (正如 tadman 指出的那样,您是在询问总数还是特定的执行路径或什么?)

标签: c assembly gdb


【解决方案1】:

在调试器中,输入x/10i main。这显示了main 入口点之后的前十条指令。 (您可以根据自己的喜好使用十以外的数字。)寻找返回指令。它可能类似于retretq。如果前十个指令中没有出现,请按回车键。 (这重复/继续上一个命令,显示接下来的十个指令。您还可以键入 x/10i 以从当前位置继续。)当您看到返回指令时,计算从 main 到它的指令。

您还可以使用 GCC 的 -S 开关编译为程序集。如果您的源文件名为foo.c,这将生成一个包含程序集源的文件,名称为foo.s。然后您可以在文本编辑器中查看它以计算从main: 标签到返回的指令。 (此文件可能包含各种其他信息 - 没有指令的标签,编译器出于信息/调试目的插入的 cmets,不是指令的特殊汇编程序指令等等,因此如果您在其中计算指令可能会很困难不熟悉哪些是指令,哪些不是。调试器可能更容易用于此任务,因为它显示原始指令。)

从技术上讲,C 中的函数不一定编译为一组简单的顺序指令。编译器可以将来自被调用函数的代码嵌入到调用函数中。从理论上讲,它可以将一个函数的指令放在多个不同的地方(尽管根据我的经验,编译器往往不会这样做),它们之间有跳转。因此,计数说明通常仅用于简单的课堂练习和学习探索。

【讨论】:

  • 我不认为 x86 是指定的......但很有可能是这样。
  • @old_timer:因此“它可能是……”
猜你喜欢
  • 2015-06-13
  • 2012-07-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多