c语言怎么注释掉一大段_从汇编的角度看C语言(一)
gcc -S 参数可以把C语言代码转换成汇编代码。对照汇编代码看C别有一番风味,很多编译器行为都有了本质的解释。
本人对汇编也是一知半解,工作中没有用到过,上学时候学的还是16位的汇编,基本上也忘光了。一边学习一边记录吧。
复习汇编,一个简单的例子
如下是一段非常简单的c程序
把它编译成汇编
gcc -S aa.cpp
生成汇编结果aa.s, 我在文件中增加了一些注释。
本程序只有一个代码段,没有数据段。参数和临时变量存储在栈中,栈属于代码段。本程序栈空间的组织如下:
函数调用
再分析以下带简单函数调用的例子
对照的汇编代码如下:
程序栈如下:
HelloWorld分析
HelloWorld很多时候都被认为是最简单的,但其实没那么简单。因为涉及到输出调用,这个函数的调用比普通函数复杂。而且HelloWorld不只有代码段
先看C程序:
对应的汇编程序
. 编译优化
C语言程序
不优化编译
gcc -S dd.c 生成结果:
其中a和c对应的栈地址是-20和-28, 因为c语言函数没有给他们赋初值,汇编一样没有操作,所以这两个变量的值是栈内存上原来的值。不付初值少了汇编指令,理论上效率高些。但程序安全性降低不少,综合考虑,还是养成赋初值的习惯比较好。
我们再试试优化编译
gcc -S -O2 dd.c 生成代码
把赋值,加法全都干掉了。直接输出100的最终结果。太酷了!
还没有评论,来说两句吧...