《Programming Ground Up》(下面简称PGUBook)是一本使用GFDL协议发布的书。我是从TualatriX的博客上看到的关于这本书的介绍的。
PGUBook从汇编开始讲编程,但是绝不仅仅在于汇编,而是重于编程思想。书的前面大部分都是围绕汇编在讲,后面则有一部分讲C语言和其他。本来我以为这本书讲汇编一定不会勾起我的兴趣的,不料粗略浏览一看,发现PGUBook讲的比我大二的时候学的汇编要深刻很多。这本书只讨论x86和Linux,一方面使我对x86的理解深刻了不少,另外也使我有充分的环境去实现书上的例子。书的封面截图在下面,更详细的介绍可以看它的官方主页http://savannah.nongnu.org/projects/pgubook/
我看了PGUBook半个多月来,到今天整整看了五章了,感觉是越看越想看。主要原因是正如它第一章里所说的,没有把一些其他书回避的晦涩的地方一带而过,而是用比较好的章节结构使读者逐步去掌握一些x86的设计理念。而且看了PGUBook之后,对C语言的很多行为的理解有了很大提高,比如说调用函数时怎样压栈,Linux下gcc是倒序把参数压栈,所以函数中的相关参数怎样影响就可以很好理解了,比如f(a++, a++)之类的。当然其他编译器处理手段会一样,而且也不符合C语言规范,我只是想用来说明有助于理解。
接下来几周陆续写上读书笔记和小结,这次先把x86的简要架构写上。
32位的x86有6个通用寄存器和4个特殊寄存器,以前学的时候感受没这么深刻,现在倒是很容易就记下来。6个通用寄存器分别是:%eax(累加寄存器),%ebx(基本),%ecx(计数),%edx(数据),%esi(源索引),%edi(目的索引)。不过其实对于32位的x86来说,其实它们都是通用的,可以代替对方,那些括号里的含义在16位的时代才比较有意义。另外四个特殊寄存器是:%esp,栈寄存器,指向目前的栈顶;%ebp,基址寄存器,常和%edi组合使用;%eip,指向下一条指令的地址;%eflags,标志寄存器,对比较指令特有用。
寒假过一半前希望能把PGUBook看完一次。