汇编小结
这篇书评可能有关键情节透露
一、序
汇编是初级阶段的第二步,发现在组成原理、opcode以及EasyVM源码的基础之上看汇编,果然会有顺流而下的感觉,一些之前感到艰深的概念突然变得迎刃而解了。
其实我并没有看完这本书,严格说是看了一小部分,我所重点关注的只有第3章的“指令系统和寻址方式”和第8章的“输入输出程序设计”,现在回想起来,主要带着两个目的,一个是把指令系统的过一遍,这样日后用OD反汇编的时候就不会感到吃力了,另外一个,便是尝试寻找看EasyVM源码时遗留的两个问题的答案。
二、Opcode观点看寻址
先说一下寻址,之前看汇编的时候,这是一个极大的拦路虎,感到晦涩难于理解记忆,这也是我一直对汇编没有信心的原因之一。后来看《疯狂的程序员》,绝影提到使用C中的数组等概念来理解寻址,仍觉得不甚理想,这次在opcode的观点之下,异常轻松的捅破了这个纸老虎。
opcode的结构是prefix+opcode+Mod-Reg-R/B+SIB+disp+imme,这里的imme便对应立即寻址,寄存器寻址对应reg(这里可以是Mod-Reg-R/M,也可以是SIB中的I/B),disp意味着相对(只存在disp时为直接),SIB为间接,其中S为比例,I为变址,B为基址。在这个观点之下,n种寻址方式便被拆解了。比如相对基址比例变址就是EA=B+S*I+disp。
实际上,汇编的寻址是后于opcode的,是由opcode结构所决定的,这样解释有点“羊毛是毯子做的”的嫌疑,不过只有深入理解本质才能丢掉记忆的包袱。
三、指令系统
较为认真的过了一下指令系统,在EasyVM源码的基础上,相对轻松,有几个概念模糊的指令搞清楚了,许多稀有的指令也混了个眼熟。打开OD,随便拖个exe进去,放眼望去,没有陌生的指令了,甚至看opcode一列,或多或少能看出一点点门道,感觉还不错,至少扫清了逆向的基本障碍。
四、输入输出程序设计
原理中早已提到与IO设备交互的方式有5种,PC上常见的有三种,轮询就是in/out;中断这个神奇的概念,已经有了充分的关注,并且和原理有较大重叠;DMA只是简单介绍。主要是中断、调试、中断向量表、中断处理函数的修改等概念的感受。
再然后就是建立在基础IO之上的BIOS和DOS封装抽象,不是重点,了解一下键盘缓冲区显存,回顾一下学习C语言时对扫描码和显示模式等的困惑,了解一下神秘的串口通信,丢包的检测和重发之类的细节自由协议保证,回顾一下之前看VC++串口编程时被一些奇怪的类和波特率之类的概念搞的不知所措,不由会心一笑。其余种种,大抵如此。
五、磁盘文件存取
最后是磁盘文件存取,与组成原理的相关知识相辅相成,有了原理的基础,就可以抛开硬件细节,专心在抽象之上了,而这种建立在基本IO之上的BIOS和DOS抽象,与C语言中相应的库函数之类遥相呼应,这些熟悉的概念是远在DOS时代便已经确定流传的,这些熟悉的库函数,是对BIOS/DOS调用的一层封装。即便是到了现在的Windows API,依旧能看到许许多多顺流而下的影子。没错,这就是我现在所想要的。理解底层的实现,建立顺流而下的宏观分层技术图景,然后用上层的封装去实现应用,最后利用这图景去解决疑难调试和优化问题。核心的不是知识点本身,而是这些技术背后的推动力量,一种计算机科学的精神,技术可以千变万化层出不穷,但这个精神这些元模型却一直保持不变,就像文明的火种一样。
六、汇编程序设计
我跳过了汇编程序设计的部分,看目录,伪指令、宏汇编、上机等,这些直觉上不是纯汇编,相反是一个建立在汇编之上的新的语言,只是比C更底层,有预处理、语法检查、汇编和连接等过程,而这些是下一步所要关注的事情。现在不必也不能关心,因为时间不多。
七、遗留问题
回首最初的两个目的,第一个已经实现,第二个部分实现。之前的两个遗留问题,一个是中断处理函数的初始化及内容,这个是BIOS负责的,需要看EasyVM的BIOS的汇编实现,第二个是in/out处理函数的注册及调用,依旧不是十分明朗。
按惯例,总结下遗留问题:
1.存储器保护模式下的分段
这是CPU体系结构时欠下的债,没有了解保护模式的细节,后续通过《软件调试》的相关章节弥补
2.IO的实现及中断
IO设备如何在独立的编址空间注册,中断产生CPU如何获取中断号和中断处理函数地址,这个中断处理函数又是设备如何注册的。中断扩展是什么。
八、参考
1.IBM-PC汇编语言程序设计(第2版)
http://book.douban.com/subject/1091718/
2.EasyVM学习之OpCode
http://hi.baidu.com/xslug/blog/item/84a1383021bcb3a45fdf0e0a.html
3.计算机组成原理
http://book.douban.com/subject/1239582/
4.自己写的简单虚拟机 easyVM 0.2
http://bbs.pediy.com/showthread.php?t=96970
5.软件调试
http://book.douban.com/subject/3088353/
ref:
http://hi.baidu.com/xslug/blog/item/ccc7294a50d3a6fc83025c36.html
汇编是初级阶段的第二步,发现在组成原理、opcode以及EasyVM源码的基础之上看汇编,果然会有顺流而下的感觉,一些之前感到艰深的概念突然变得迎刃而解了。
其实我并没有看完这本书,严格说是看了一小部分,我所重点关注的只有第3章的“指令系统和寻址方式”和第8章的“输入输出程序设计”,现在回想起来,主要带着两个目的,一个是把指令系统的过一遍,这样日后用OD反汇编的时候就不会感到吃力了,另外一个,便是尝试寻找看EasyVM源码时遗留的两个问题的答案。
二、Opcode观点看寻址
先说一下寻址,之前看汇编的时候,这是一个极大的拦路虎,感到晦涩难于理解记忆,这也是我一直对汇编没有信心的原因之一。后来看《疯狂的程序员》,绝影提到使用C中的数组等概念来理解寻址,仍觉得不甚理想,这次在opcode的观点之下,异常轻松的捅破了这个纸老虎。
opcode的结构是prefix+opcode+Mod-Reg-R/B+SIB+disp+imme,这里的imme便对应立即寻址,寄存器寻址对应reg(这里可以是Mod-Reg-R/M,也可以是SIB中的I/B),disp意味着相对(只存在disp时为直接),SIB为间接,其中S为比例,I为变址,B为基址。在这个观点之下,n种寻址方式便被拆解了。比如相对基址比例变址就是EA=B+S*I+disp。
实际上,汇编的寻址是后于opcode的,是由opcode结构所决定的,这样解释有点“羊毛是毯子做的”的嫌疑,不过只有深入理解本质才能丢掉记忆的包袱。
三、指令系统
较为认真的过了一下指令系统,在EasyVM源码的基础上,相对轻松,有几个概念模糊的指令搞清楚了,许多稀有的指令也混了个眼熟。打开OD,随便拖个exe进去,放眼望去,没有陌生的指令了,甚至看opcode一列,或多或少能看出一点点门道,感觉还不错,至少扫清了逆向的基本障碍。
四、输入输出程序设计
原理中早已提到与IO设备交互的方式有5种,PC上常见的有三种,轮询就是in/out;中断这个神奇的概念,已经有了充分的关注,并且和原理有较大重叠;DMA只是简单介绍。主要是中断、调试、中断向量表、中断处理函数的修改等概念的感受。
再然后就是建立在基础IO之上的BIOS和DOS封装抽象,不是重点,了解一下键盘缓冲区显存,回顾一下学习C语言时对扫描码和显示模式等的困惑,了解一下神秘的串口通信,丢包的检测和重发之类的细节自由协议保证,回顾一下之前看VC++串口编程时被一些奇怪的类和波特率之类的概念搞的不知所措,不由会心一笑。其余种种,大抵如此。
五、磁盘文件存取
最后是磁盘文件存取,与组成原理的相关知识相辅相成,有了原理的基础,就可以抛开硬件细节,专心在抽象之上了,而这种建立在基本IO之上的BIOS和DOS抽象,与C语言中相应的库函数之类遥相呼应,这些熟悉的概念是远在DOS时代便已经确定流传的,这些熟悉的库函数,是对BIOS/DOS调用的一层封装。即便是到了现在的Windows API,依旧能看到许许多多顺流而下的影子。没错,这就是我现在所想要的。理解底层的实现,建立顺流而下的宏观分层技术图景,然后用上层的封装去实现应用,最后利用这图景去解决疑难调试和优化问题。核心的不是知识点本身,而是这些技术背后的推动力量,一种计算机科学的精神,技术可以千变万化层出不穷,但这个精神这些元模型却一直保持不变,就像文明的火种一样。
六、汇编程序设计
我跳过了汇编程序设计的部分,看目录,伪指令、宏汇编、上机等,这些直觉上不是纯汇编,相反是一个建立在汇编之上的新的语言,只是比C更底层,有预处理、语法检查、汇编和连接等过程,而这些是下一步所要关注的事情。现在不必也不能关心,因为时间不多。
七、遗留问题
回首最初的两个目的,第一个已经实现,第二个部分实现。之前的两个遗留问题,一个是中断处理函数的初始化及内容,这个是BIOS负责的,需要看EasyVM的BIOS的汇编实现,第二个是in/out处理函数的注册及调用,依旧不是十分明朗。
按惯例,总结下遗留问题:
1.存储器保护模式下的分段
这是CPU体系结构时欠下的债,没有了解保护模式的细节,后续通过《软件调试》的相关章节弥补
2.IO的实现及中断
IO设备如何在独立的编址空间注册,中断产生CPU如何获取中断号和中断处理函数地址,这个中断处理函数又是设备如何注册的。中断扩展是什么。
八、参考
1.IBM-PC汇编语言程序设计(第2版)
http://book.douban.com/subject/1091718/
2.EasyVM学习之OpCode
http://hi.baidu.com/xslug/blog/item/84a1383021bcb3a45fdf0e0a.html
3.计算机组成原理
http://book.douban.com/subject/1239582/
4.自己写的简单虚拟机 easyVM 0.2
http://bbs.pediy.com/showthread.php?t=96970
5.软件调试
http://book.douban.com/subject/3088353/
ref:
http://hi.baidu.com/xslug/blog/item/ccc7294a50d3a6fc83025c36.html