ASM 板


LINE

看板 ASM  RSS
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







like.gif 您可能会有兴趣的文章
icon.png[问题/行为] 猫晚上进房间会不会有憋尿问题
icon.pngRe: [闲聊] 选了错误的女孩成为魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一张
icon.png[心得] EMS高领长版毛衣.墨小楼MC1002
icon.png[分享] 丹龙隔热纸GE55+33+22
icon.png[问题] 清洗洗衣机
icon.png[寻物] 窗台下的空间
icon.png[闲聊] 双极の女神1 木魔爵
icon.png[售车] 新竹 1997 march 1297cc 白色 四门
icon.png[讨论] 能从照片感受到摄影者心情吗
icon.png[狂贺] 贺贺贺贺 贺!岛村卯月!总选举NO.1
icon.png[难过] 羡慕白皮肤的女生
icon.png阅读文章
icon.png[黑特]
icon.png[问题] SBK S1安装於安全帽位置
icon.png[分享] 旧woo100绝版开箱!!
icon.pngRe: [无言] 关於小包卫生纸
icon.png[开箱] E5-2683V3 RX480Strix 快睿C1 简单测试
icon.png[心得] 苍の海贼龙 地狱 执行者16PT
icon.png[售车] 1999年Virage iO 1.8EXi
icon.png[心得] 挑战33 LV10 狮子座pt solo
icon.png[闲聊] 手把手教你不被桶之新手主购教学
icon.png[分享] Civic Type R 量产版官方照无预警流出
icon.png[售车] Golf 4 2.0 银色 自排
icon.png[出售] Graco提篮汽座(有底座)2000元诚可议
icon.png[问题] 请问补牙材质掉了还能再补吗?(台中半年内
icon.png[问题] 44th 单曲 生写竟然都给重复的啊啊!
icon.png[心得] 华南红卡/icash 核卡
icon.png[问题] 拔牙矫正这样正常吗
icon.png[赠送] 老莫高业 初业 102年版
icon.png[情报] 三大行动支付 本季掀战火
icon.png[宝宝] 博客来Amos水蜡笔5/1特价五折
icon.pngRe: [心得] 新鲜人一些面试分享
icon.png[心得] 苍の海贼龙 地狱 麒麟25PT
icon.pngRe: [闲聊] (君の名は。雷慎入) 君名二创漫画翻译
icon.pngRe: [闲聊] OGN中场影片:失踪人口局 (英文字幕)
icon.png[问题] 台湾大哥大4G讯号差
icon.png[出售] [全国]全新千寻侘草LED灯, 水草

请输入看板名称,例如:BabyMother站内搜寻

TOP