如何学习C ++代码和生成的汇编代码之间的联系?

时间:2011-09-27 09:41:11

标签: c++ windows compiler-construction assembly

我的问题是专门针对Windows C ++编译器和Visual Studio,但我有幸接受了一份金融工作的采访,他们希望有人非常技术性地编写实时多线程代码,他们可以在汇编级别分析生成的代码通过C ++编译器。

有什么方法可以用来学习C ++代码和生成的程序集之间的联系并达到这种熟练程度?

2 个答案:

答案 0 :(得分:4)

对此的简单回答是:。编译代码并在调试器中查看它。

调试器将以非常苛刻的方式显示两者之间的连接。下一步是理解编译器理论,然后查看编译器的源代码,以了解他们尝试和做的事情。

我认为面试你的人可能一直试图了解你是否能够理解所涉及的是什么样的努力 - 而不是真正知道如何去做。

答案 1 :(得分:1)

要做的第一件事就是学习汇编程序和机器代码。 有一些关于机器代码的非常好的文档 英特尔网站(尽管它可能比您需要的更详细)。那里 是广泛使用的两种常见汇编程序格式:使用的格式 Microsoft基于原始的英特尔汇编程序,g ++使用 完全不同的东西(基于原始的Unix汇编程序) PDP-11),所以你必须选择一个(虽然汇编语法 本身很少是一个真正的问题 - 知道个人是什么 说明做的更重要。)

一旦你对如何阅读汇编程序有了一些了解:大多数编译器 有输出汇编程序的选项:对于VC ++,使用/Fa(以及/c, 如果你不想真正链接结果);对于g ++,-S(其中 导致编译器在生成汇编程序后停止。在里面 在VC ++的情况下,汇编程序将位于文件xxx.asm中(其中xxx.cpp 对于g ++,xxx.s,是正在编译的文件的名称。尝试 编译一些代码,具有不同的优化级别,然后 在编辑器中查看汇编程序。

最后,如果提出问题,那可能是因为面试官 关注性能问题;他真正感兴趣的是 你是否知道各种运营的相对成本(或风险 多线程时涉及;例如什么操作是原子的等等。) 在哪种情况下,指出类似的问题可能不会有什么坏处 locality(确定缓存命中百分比)往往更多 个人操作很重要。