作者lihgong (当宪兵是我一辈子的耻辱)
看板ASM
标题[书评] Programming from the Ground Up
时间Fri Mar 12 00:51:00 2010
Programming from the Ground Up
http://ftp.twaren.net/Unix/NonGNU/pgubook/
(免费下载)
----
这是一本观点独特的书, 他用组合语言的方式, 阐述程式最底层的世界
这样讲听来有点空洞, 直接看这本书第一个程式吧
Chapter 3. Your First Programs
----
.section .text
.global _start
_start:
movl $1, %eax
movl $0, %ebx
int $0x80
这是 Linux底下, 一段小到不能再小的程式
程式从 _start 进入, 然後设定 x86 暂存器: %eax = 1, %ebx = 0
int $80 是发出软体中断的指令, 其中 0x80 代表 Linux System Call
呼叫 System Call 的时候
%eax 放 system call ID, 1 表示离开程式
%ebx 表示 main function 的 return value
呼叫完这个 system call, Linux 就会结束程式
并把 %ebx 的内容当作 main() 的回传值
User 接下来可以在 shell 里, 打 echo $? 观察这个回传值
----
这个例子真的口味独特 !!
他解释一般程式是怎麽和 OS 沟通, 怎麽呼叫 system call
另外用很少的程式码, 解释组合语言的设施
看过这一小段程式, 起码我知道, 当我呼叫 exit() 时, 原来做了这些事
书上还有用组合语言, 写一小段程式, 开档, 把所有字转大写, 存档, 关档
WHAT !! 用组合语言做这些事喔 !!
当我亲自写了这段程式, 心中的感动是无以言喻的 :)
推荐给所有想知道事物真正面貌的人阅读 :)
----
Chapter 4 "All About Functions"
函数, 对应到的 assembly 语言, 这个是极端重要的 topic
靠这章的帮忙, 我总算是懂 x86的 stack frame
而且也真的写了一些 assembly function 来呼叫
这章的范例是一个函数, 计算 2^3 + 2^5, 然後回传
书上的玩法是从头到尾都用 assembly, 我是先写 C 版本, 搭配一个 main() 呼叫
int power(int base, int exp)
{
int ret = 1;
for(i=0; i<exp; i++)
ret *= base;
return ret;
}
下一步, 把 power() 改成用 assembly 写, 混用 assembly 和 C
最後, 再把整个 C 都换成 assembly, 这样玩下来收获良多
----
Chapter 5 Dealing with Files
看到这章的标题, 我还真的怀疑看错了... 档案处理耶 !!
一般的档案处理依赖神秘的 fopen/fwrite/fread, 或是底层的 open/read/write
书上告诉你, 这些东西都是藉由 OS 的 system call 完成
在呼叫 system call 之前, 把对应的 call ID 和参数放在暂存器里
然後执行 INT 0x80, OS就会接手剩下的任务了
这章节真的很不错, 隐藏在 open/read/write 底下的细节, 全部都出来了
而且用组合语言, 自己写 open/read/write, 成就感满点 !!
实现的手段和 chapter.4 一样, 先用 C 刻出骨架, 再逐渐换成组合语言
我不知道这样做对不对, 对 C我的掌握度高, 而且有骨架比较容易验证 assembly
全系统直接从 assembly 开始写, 我想我受不了 XD
----
Chapter 6 "Reading and Writing Simple Record"
这章揭露怎麽处理 struct (C 语言), 搭配 chapter 5 的档案处理
我觉得受到的刺激没有上一章那麽强悍
而且看到组语的数目直线上升, 我有点受不了了 XD
----
Chapter 7 "Developing Robust Programs"
这章有点像讲软体工程, 他告诉你程式设计师拙於估算 schedule XD
书上给了几个建议, 基本上是 "testing-driven" 程式设计方式
有种开发方式建议在撰写程式码之前, 先写好 test case
Test case 日後可以反覆验证程式, IC的 test bench 就是类似的观点
----
Chapter 8 "Sharing Functions with Code Libraries"
站在巨人的肩膀上, 所以我们在 Standard C Library 的基础上写程式
不然连 printf() 都得自己写, 实在是太难过了
这章用深入浅出的方式, 介绍怎麽连结函式库, 对应的 Linker 指令怎麽下
这一小段指令值得写在这里...
as helloworld.s -o helloworld.o
ld -dynamic-linker /lib/ld-linux.so.2 helloworld.o -lc -o helloworld
-dynamic-linker /lib/ld-linux.so.2 指示 Linker 去哪里找 dynamic linker
-lc 表示连结 LIBC (Library C), 实际会连结到 /lib/libc.so.6
helloworld.o 表示连结的目标 (我们写的程式)
-o helloworld 代表 linker 的输出是 helloworld
书上最後一个范例, 作者介绍怎麽产生 shared library
我最近才刚在 debug 时, 感受过这些机制的威力, 看这章特别有感觉
Shared library 机制用范例讲, 真的是无比清楚
----
Chapter 9 "Intermediate Memory Topics"
"The Memory Layout of a Linux Program"
搭配 Jserv 的 "深入浅出Hello World, 这里看得到完整的记忆体配置
搭配 memory layout, 作者揭示了动态配置记忆体和 OS 之间的关联
原来配置记忆体, 也是搭配 system call, 用 C++ 的 new/delete
最好知道底层"可能"的实作细节, 比较好
作者很有意思, 竟然用 assembly 写了一套 new / delete 的程式库 (虽然效能很差)
我很喜欢这个范例, 比如他透过实作, 告诉你 new 要记忆体时, 其实多要了一些
他在前面偷偷塞了一些资料, 从记忆体区块中间把指标回传
所以说, 小笔资料尽量不要用动态配置, 根本的原因在这里 (overhead大)
这一章整体碰触的 topic 很复杂, 但是作者拿捏的洽到好处, 值得一看
----
Chapter 10 "Counting Like a Computer"
2's complement
Binary <-> decimal
AND/OR/XOR logical operation
Bit-Wise operation
Big/Little Endian
像我这种每天被 fixed point 运算折磨的人, 这章是选择直接跳过
毕竟我可是每天用身体感受啊
----
Chapter 11 "High-Level Language"
Chapter 12 "Optimization"
Chapter 13 "Moving On from Here"
这三章都比较短, 比较没有我喜欢的底层的东西, 我当故事书很快的读过
----
Appendix A. GUI Programming
用 gtk 在 Linux 上写视窗程式... 而且是用 assembly... 算了...
----
Appendix B. Common x86 Instructions
这是一个不错的 reference, 他还简单的介绍 assembler 的虚指令 (directive)
基本上这些资料真的要找, google一大堆
----
Appendix C. Important System Calls
Linux 一些书上出现过的 system call 列表
----
Appendix D. ASCII Codes
----
Appendix E. C Idioms in Assembly Language
值得一看, 可以大概认识平常用的 C, 会怎麽对应到组语 (for x86)
----
Appendix F. Using GDB Debugger
托这本书的福? 我总算会用 GDB debug 了
用命令下中断, 单步执行, 印 call stack 实在很有意思 (也很不直觉)
我觉得 GDB 值得学, 看完这本书, 我又多一个 debug 的武器了
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 118.160.86.19
1F:推 manchester77:不错... 03/12 11:47
2F:推 oracle905:推!!!! 03/12 16:16
3F:推 cockskin:超棒的 有下有推 03/12 23:16
4F:推 james732:有下有推!!!! 03/19 10:51
5F:推 autoexe:超棒的!推! 03/23 14:19
6F:推 mabus:推! 08/12 18:04