不同编译器生成的汇编代码?

时间:2014-01-08 19:08:10

标签: assembly arm

我已经开始研究ARM arch的程序集。我读了一些pdf文件和net中的小教程。我理解那里的代码。 但是当我在GCC中编写一个简单的hello world程序时,它给出了一个汇编文件,其内容与我在pdf和internet中学到的内容非常不同。(我的意思是主要是汇编指令)。

所以,这意味着不同编译器生成的汇编代码是不同的(所有使用不同的方式来编写汇编程序指令和其他一些东西)。 正如我在互联网上阅读的教程一样,我猜它们基于基尔编译器。

如果我上面写的是真的,那么根据哪个编译器我将学习ARM的汇编语言。

1 个答案:

答案 0 :(得分:2)

您应该根据您拥有的机器的指令集和体系结构(以及根据您正在使用的汇编程序的指令)学习汇编。学习汇编的两个主要原因是理解一个指令集,并且做一些在更高级语言中不可能完成的事情 - 查看映射到更高级语言的功能子集并不是那么有用在任何方面,如果编译器优化已经将其转变为无法识别,那么更不会这样我会说在ARM上尤其如此,指令集可以做各种古怪的事情 - 它与高级语言完全不同,最好用自己的术语来解决。

正如您所注意到的那样,查看编译输出 有助于了解编译器的工作原理 - 具有不同优化策略的不同编译器有时最终会以非常不同的方式实现相同的高级代码。

也就是说,编译后的代码可以很方便地用于“这个循环在汇编中看起来像什么”这样的基础知识 - 在这种情况下,编译器的选择根本不重要,因为你要保持简单尽可能。这意味着禁用所有优化,坚持使用标准C(我个人甚至会使用C99上的ANSI C),并将感兴趣的代码保存在小的独立函数中,以便更容易理解反汇编。但是,过去的基础知识,这不是“学习汇编语言”,而是“在汇编语言环境中学习C语言”。