c语言怎么注释掉一大段_从汇编的角度看C语言(一)

古城微笑少年丶 2023-01-10 10:16 234阅读 0赞

gcc -S 参数可以把C语言代码转换成汇编代码。对照汇编代码看C别有一番风味,很多编译器行为都有了本质的解释。
本人对汇编也是一知半解,工作中没有用到过,上学时候学的还是16位的汇编,基本上也忘光了。一边学习一边记录吧。

复习汇编,一个简单的例子

如下是一段非常简单的c程序

4ccc357a111cbdaad0f2559cfa09db77.png

把它编译成汇编
gcc -S aa.cpp
生成汇编结果aa.s, 我在文件中增加了一些注释。

68326e5326828456633cbed5777720cd.png

本程序只有一个代码段,没有数据段。参数和临时变量存储在栈中,栈属于代码段。本程序栈空间的组织如下:

5a228ce056a6453f17a108e3f4c7ad21.png

函数调用

再分析以下带简单函数调用的例子

aaa7bf17a4ad2d25baf627eb51bc691b.png

对照的汇编代码如下:

bfc83760c96b36bc1d48ec4c92d2aaa7.png

6357aff0da8d5811f5c7914c5d8635ef.png

程序栈如下:

af093906e324fa582335268e8ca57c5c.png

HelloWorld分析

HelloWorld很多时候都被认为是最简单的,但其实没那么简单。因为涉及到输出调用,这个函数的调用比普通函数复杂。而且HelloWorld不只有代码段
先看C程序:

87d3061a8ac6220599febbe58dd90462.png

对应的汇编程序

5b4673e2afa5ae77634fb6b6016cf170.png

. 编译优化

C语言程序

d0b4dadb737da9fb48fda6ba508a8336.png

不优化编译
gcc -S dd.c 生成结果:

caab782898ae041a2d72b9580d79b9be.png

其中a和c对应的栈地址是-20和-28, 因为c语言函数没有给他们赋初值,汇编一样没有操作,所以这两个变量的值是栈内存上原来的值。不付初值少了汇编指令,理论上效率高些。但程序安全性降低不少,综合考虑,还是养成赋初值的习惯比较好。
我们再试试优化编译
gcc -S -O2 dd.c 生成代码

e02485badaf1cecd9021360e3f5f3d3e.png

把赋值,加法全都干掉了。直接输出100的最终结果。太酷了!

发表评论

表情:
评论列表 (有 0 条评论,234人围观)

还没有评论,来说两句吧...

相关阅读

    相关 C-汇编

    最近还真是挺忙的,做欢神的小内核实验,读书,学汇编,今天一个朋友问了个问题,  内联函数在传指针参数的时候,有没有拷贝这个指针,然后我就尝试写了个代码,汇编看代码,我去