Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 从汇编表单中计算出命令数_C_Assembly_Gdb - Fatal编程技术网

C 从汇编表单中计算出命令数

C 从汇编表单中计算出命令数,c,assembly,gdb,C,Assembly,Gdb,我有一个C文件,我把它转换成汇编形式,我想知道使用gdb和汇编文件在主函数上有多少条指令。如何执行此操作?在调试器中,键入x/10i main。显示main入口点后的前十条指令。(您可以根据需要使用10以外的数字。)查找返回指令。它可能类似于ret或retq。如果前十条说明中没有显示,请按return。(这将重复/继续上一个命令,显示接下来的十条指令。您还可以键入x/10i从当前位置继续。)当您看到返回指令时,计算从main到它的指令数 您还可以使用GCC的-s开关编译为汇编。如果源文件名为fo

我有一个C文件,我把它转换成汇编形式,我想知道使用gdb和汇编文件在主函数上有多少条指令。如何执行此操作?

在调试器中,键入
x/10i main
。显示
main
入口点后的前十条指令。(您可以根据需要使用10以外的数字。)查找返回指令。它可能类似于
ret
retq
。如果前十条说明中没有显示,请按return。(这将重复/继续上一个命令,显示接下来的十条指令。您还可以键入
x/10i
从当前位置继续。)当您看到返回指令时,计算从
main
到它的指令数

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


从技术上讲,C中的函数不一定要编译成一组简单的顺序指令。编译器可以将被调用函数中的代码嵌入到调用函数中。从理论上讲,它可以将一个函数的指令放在多个不同的位置(尽管根据我的经验,编译器通常不会这样做),并在它们之间进行跳跃。因此,除了简单的课堂练习和学习探索外,计算指令通常没有多大用处。

请在问题中发布更多细节,这没有多大意义。我想我指的是“指令”,我的术语不太好。重点是,我正在做的练习说,我应该使用“x/??I*main”命令,然后计算出主屏幕上有多少条指令,比mud更清晰。请提出一个恰当的问题。如果没有具体的例子,这个问题就无法真正得到回答。你所说的“有多少说明”是什么意思?比如在操作期间执行了多少次,或者代码中有多少次?优化编译器可能会为了速度而展开循环,即使它看起来像“更多指令”。编译然后反汇编并手动计数。了解不同的编译器或同一编译器的不同版本以及编译器设置/选项可以/将提供截然不同的结果,同时仍然提供功能正确的代码。(正如塔德曼所指出的,你是在问总数、特定的执行路径还是什么?)我不认为x86被指定了……但很有可能是这样。@old_timer:因此“它可能类似于…”