c - 从汇编表单中找出命令的数量
问题描述
我有一个 C 文件,我将它转换为汇编形式,我想知道使用 gdb 和汇编文件在主函数上有多少指令。我怎样才能做到这一点?
解决方案
在调试器中,键入x/10i main
. 这显示了main
入口点之后的前十条指令。(您可以根据自己的喜好使用十以外的数字。)寻找返回指令。它可能类似于ret
或retq
。如果前十个指令中没有出现,请按回车键。(这会重复/继续上一个命令,显示接下来的十个指令。您还可以键入x/10i
从当前位置继续。)当您看到返回指令时,计算来自main
它的指令。
您还可以使用 GCC 的-S
开关编译为程序集。这将生成一个包含程序集源的文件,foo.s
如果您的源文件名为foo.c
. 然后您可以在文本编辑器中查看它以计算从main:
标签到返回的指令。(这个文件可能包含各种其他信息——没有指令的标签、编译器为信息/调试目的插入的注释、不是指令的特殊汇编器指令等等,所以如果你在其中计算指令可能会很困难不熟悉哪些东西是指令,哪些不是。调试器可能更容易用于此任务,因为它显示原始指令。)
从技术上讲,C 中的函数不一定编译为一组简单的顺序指令。编译器可以将来自被调用函数的代码嵌入到调用函数中。从理论上讲,它可以将一个函数的指令放在多个不同的地方(尽管根据我的经验,编译器往往不会这样做),并在它们之间进行跳转。因此,计数指令通常仅用于简单的课堂练习和学习探索。
推荐阅读
- javascript - 如何通过 Express JS 服务器使 React JS 和 Socket IO 连接在一起?
- excel - 使用多条件计算唯一值
- python - 测试 Twitch 流是否与 Python 和 TwitchAPI 一起直播
- latex - 如何删除默认标题和作者信息,但在 acmart 文档类中保留行号
- python - 我的机器人的一个功能只有在我的电脑上运行时才起作用
- c - 如何使用 Apple 安全框架从证书中检索主题或颁发者可分辨名称?
- selenium - 在 Eclipse Selenium TestNG 中执行测试用例时出现错误
- python - 如何在机器人播放后删除 mp3 文件
- java - 在 JavaFX 中为 ButtonType 添加 css 样式
- angular - 从 ViewContainerRef 中移除组件