【发布时间】:2011-04-23 07:50:30
【问题描述】:
有没有什么地方可以找到死的简单 C 和 x86 程序的并排示例?到目前为止,我在 Internet 上找到的示例似乎直接从“这里是 x86 中的 Hello World”跳转到“编写自己的操作系统!”当您执行诸如调用函数之类的操作时,我无法内化必须发生的事情。
【问题讨论】:
-
你的意思是x86汇编语言吗?或者有没有一种叫做 x86 的语言?
有没有什么地方可以找到死的简单 C 和 x86 程序的并排示例?到目前为止,我在 Internet 上找到的示例似乎直接从“这里是 x86 中的 Hello World”跳转到“编写自己的操作系统!”当您执行诸如调用函数之类的操作时,我无法内化必须发生的事情。
【问题讨论】:
我建议看一下 GCC 的中间程序集输出,例如调用
gcc -S a.c
然后看看a.s
大多数时候,更小更容易理解的程序集是通过优化生成的,所以你宁愿使用
gcc -O -S a.c
【讨论】:
如果您指的是 x86 汇编语言,请使用objdump --disassemble myprog(在任何 GNU 系统上)来显示您的 C 程序生成的汇编语言。如果您的系统没有 objdump,您可以使用 ndisasm。
【讨论】:
假设您的意思是 x86 汇编器,那么使用 gcc 您可以使用 gcc -S yourhelloworldprogram.c 来获取汇编器输出。对于 Visual Studio,您可以通过以下方式获得汇编器输出:How do I get the assembler output from a C file in VS2005
【讨论】:
我推荐ddd。您可以同时显示 C 源代码(如果您使用调试符号构建)和机器代码。您还可以以交互方式遍历代码以探测寄存器和内存值。一个很棒的学习工具。
【讨论】:
在 gcc 上,您可以使用 -save-temps -fverbose-asm 选项,它比 -S 选项更好,因为它仍然会生成目标文件并且您还可以获得预处理器文件。 verbose-asm 也很重要,因为它将 cmets 添加到程序集输出中,从而在程序的函数和变量名称与生成的汇编代码之间建立链接。尤其是在优化生成时,通常很难在源 C 和程序集之间建立链接。
【讨论】: