做过很多c/c++的 ,但是还是有很多不明白的地方,也许是因为没有完整的学习过编译器的知识吧
看看下面这个最简单的例子
//xxx.c
#include <stdio.h>
int power(int m,int n);
main()
{
int i;
for(i=0;i<10;++i)
printf("%d %d %d\n",i,power(2,i),power(-3,i));
return 0;
}
int power(int base,int n)
{
int i,p;
p=1;
for(i=1;i<=n;++i)
p=p*base;
return p;
}
我在window xp下用gcc -S xxx.c翻译,之所以这样说是因为它还不是.o文件,就说它还不是机器码
看看xxx.s
.file "poer.c"
.def ___main; .scl 2; .type 32; .endef
.section .rdata,"dr"
LC0:
.ascii "%d %d %d\12\0"
.text
.globl _main
.def _main; .scl 2; .type 32; .endef
_main:
pushl %ebp
movl %esp, %ebp
pushl %ebx
subl $36, %esp
andl $-16, %esp
movl $0, %eax
addl $15, %eax
addl $15, %eax
shrl $4, %eax
sall $4, %eax
movl %eax, -12(%ebp)
movl -12(%ebp), %eax
call __alloca
call ___main
movl $0, -8(%ebp)
L2:
cmpl $9, -8(%ebp)
jg L3
movl -8(%ebp), %eax
movl %eax, 4(%esp)
movl $-3, (%esp)
call _power
movl %eax, %ebx
movl -8(%ebp), %eax
movl %eax, 4(%esp)
movl $2, (%esp)
call _power
movl %ebx, 12(%esp)
movl %eax, 8(%esp)
movl -8(%ebp), %eax
movl %eax, 4(%esp)
movl $LC0, (%esp)
call _printf
leal -8(%ebp), %eax
incl (%eax)
jmp L2
L3:
movl $0, %eax
movl -4(%ebp), %ebx
leave
ret
.globl _power
.def _power; .scl 2; .type 32; .endef
_power:
pushl %ebp
movl %esp, %ebp
subl $8, %esp
movl $1, -8(%ebp)
movl $1, -4(%ebp)
L6:
movl -4(%ebp), %eax
cmpl 12(%ebp), %eax
jg L7
movl -8(%ebp), %eax
imull 8(%ebp), %eax
movl %eax, -8(%ebp)
leal -4(%ebp), %eax
incl (%eax)
jmp L6
L7:
movl -8(%ebp), %eax
leave
ret
.def _printf; .scl 2; .type 32; .endef
我们从后向前解释这段的话:
L7是power()函数中最后一句return p的汇编码,
在L6的jg L7调用的。
movl -8(%ebp), %eax
imull 8(%ebp), %eax
movl %eax, -8(%ebp)
leal -4(%ebp), %eax
incl (%eax)
是 for(i=1;i<=n;++i)
p=p*base; 的汇编码
movl -8(%ebp), %eax
movl %eax, 4(%esp)
movl $-3, (%esp)
call _power //相当于将power()的两个参数入栈,再call _power() <3>
movl %eax, %ebx
movl -8(%ebp), %eax
movl %eax, 4(%esp)
movl $2, (%esp)
call _power
movl %ebx, 12(%esp)
movl %eax, 8(%esp)
movl -8(%ebp), %eax
movl %eax, 4(%esp)
movl $LC0, (%esp)
call _printf //理论上同_power
以上几段的汇编代码是L2中的执行语句
<3>再转到下面的语句执行
_power:
pushl %ebp
movl %esp, %ebp
subl $8, %esp
movl $1, -8(%ebp)
movl $1, -4(%ebp)
main中的代码相当于做了一些初始,比如在系统中为这个程序做程序代码,数据栈的初始。分配程序空间。
我不知道自己的分析是否完全对,但是它是我个人的理解,开发了几年的程序,写了几十万行代码,我对计算机还是不懂。
最近研究了一些机器码,linux,再加上5年前自己看过x86,当时还不是很懂,压力使得我的学习只是为了满足工作的需要,
做过很多分析工作,最后发现自己对操作系统还是不了解。
最近参加了一个自动导航的设计,居然发现自己对计算机系统组成一点都不了解,所以研究linux,知道现在我对bootloader
的了解还只是看网上一些资料,我觉得这些人的解释,我不懂,就找了基本书来学习,最少发现,糊涂了,操作系统是什么?
前天早上醒来,很郁闷,问题:
计算机系统中包括了kvm(linux),window也有虚拟机,虚拟内存,虚拟文件,内核级和用户级,为何不论linux,window对程序的行为
不加验证的执行,说是cpu对指令不加思索的执行,可是前年,冲击波流行的时候说是将在硬件级做防御(我的记忆中的),我就想为什么不在
操作系统中对程序行为预测啦?
想象难道是哪跑的太慢吗?那么系统加上杀毒软件......?
了解了许多理论知识,到今天发觉还有许多不了解?
最近参加的东西,让我学习了arm,avr等东西
发现arm加上一些扩展就可以整合出笔记本,原来笔记本就这么简单,只是自己对基础电路太不懂了。
以前了解过window驱动的编写但是一直没有机会真正的开发过,对于linux也一样,但是有谁考虑过,比如打开播放器看片子,这一行为,从系统运作上考虑他都
做了那些工作,比如运行什么驱动,初始化lcd等,你知道请告诉我。因为我的思路比较模糊。
还有谁看完过完整的linux 2.26.28,如果有心得请告诉我,或是我们可以共同讨论下,一起说说自己的心得,如果你愿意可以给我一份资料,对各个目录的认识,主要的功能,我现在在研究,其实单个独立出来的话,就是boot,driver,network,fs(file folder system),如果写出这些东西一个内核应该是具备了。
谁开发过系统的桌面系统,比如用QT,GTK2.0甚至是swing,swt,哪怕是python,你这么做的请告诉我。
在图像方面,人脸识别我已经做过了,但是还非常的浅,如果你做过环境设别的部分,我也同样希望和你讨论,语音识别我还没有做过,不过如果你做过,请告诉我。
目前本人辞职充电中...........这些问题也是困扰我的问题
学习电子电路和数学,发现原来压力挺大的。
如果你有什么学习的建议,或是好的书籍可以介绍给我啊,如果你要和我讨论或是要告诉我那些问题,你可以加QQ:770308625,如果你对以上中很多都不知道甚至没听过,就不要加我QQ了。
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!