我与汇编--第二部分

来源:互联网 发布:2010office软件下载 编辑:程序博客网 时间:2024/04/28 09:59

前两天把8086汇编看完了,感觉不错,在这里推荐一下王爽老师的书,王老师学哲学的人的确不同凡响!这本书是我看过的唯一把汇编中各种重要细节一一清晰讲述的著作!

 

与其在这里谈太多技术细节倒不如谈谈心态和方法,细节的东西可以去看看书,班门弄斧的事情我不干。

 

汇编往往会成为程序员的分水岭。现代开发中C++/C#/Java/VB/Python等等占据了主导,谁也不会说不懂汇编会造成什么编程上的真正障碍。但是懂得汇编会让人能够更加深入的理解计算机的运行机制,这话已经是老生长谈了,不解释。

 

面对下面几种场合,懂汇编会让你如有神助:

1)病毒编写。

2)特殊软件编写,比如需要驱动级别的支持、安装各种钩子等。

3)软件破解、加密。

4)编写操作系统。

 

这些应用往往与网络安全紧密相关,所以有许多人认为懂得汇编是区分真正黑客和普通爱好者的标准。以前自己看过一篇讲黑客们发家史的文章,其中有句话:“如果你想成为一个真正的黑客,你就必须倾尽所有尽力研究汇编。”这句话当然是bullshit。但是也不完全是瞎说。深入研究底层是成为黑客的捷径!那些教你一点雕虫小技的东西都没用,学会的顶多自己玩玩,吓吓别人。

 

不扯太远了,我学习汇编为了更加深刻地了解底层,也是为了实现自己一个白日梦。说到这里,我想起了一个人——老罗。老罗被捕了,我感觉很惋惜。怎么说呢,我敬重老罗,但是我不赞成他处理爱好和事业的关系。老罗干了自己不擅长干的,所以他越走越窄。

 

对于许多人来说,汇编很难主要是因为汇编需要我们跳出现在的思维障碍。我们已经习惯于操作系统提供给我们一切。学习汇编,如果还没有学会无视操作系统那么就永远很难。另外一个重要原因,汇编不像c++/java,在学习语言语法的同时就可以基本看清整个运行原理。这主要是因为c++/java是高级语言,它们的运行情况已经经过抽象了,所以我们可以轻易理解。然而,汇编却不是这样,只会汇编语法很简单,但是只有这些东西的话,是肯定知其然而不知其所以然的。

 

汇编的语法其实不重要!重要的是汇编的运行机制是和硬件紧密相关的。这也就决定了汇编没法跳出真实世界的限制——电路本身的限制。所以从高级语言的观点来看,汇编里面有很多没有什么用,但是非常繁琐古怪的东西。比如寻址方式,就是很好的例子。我们往往习惯于用编译器打理一切,通常不会想到自己手动把高级语言的代码翻译成机器指令时会遇到的问题。简单的说吧,如果没有这么多寻址方式,计算机运行程序的效率会骤降!原因很简单汇编指令每一条都是实实在在运行的,不像高级语言,一条指令可以被编译成不等的数量的汇编指令,有时有些指令又可以直接被优化为少数几条汇编指令。换句话说,汇编语言中多执行一条指令就会多用一点时间。各种不同的寻址方式让我们可以在使用最好的方式去编码,并且尽量把一条指令用到极致,那些用一条指令完成的功能,不用两条。我不该这么啰嗦的,呵呵!

 

 

汇编与其说是一种语言而不如说是一种操控硬件的方式。我们学习汇编的本质应该是深入了解芯片的工作原理。对于那些希望学两天就可以动手写代码的人来说,汇编绝对是你的噩梦,我也建议你早点放弃。

 

所以,只有看破了程序这个东西之后,才能静下心来细细咀嚼汇编的各种特性。

 

学习汇编还有一点和学别的知识不一样的地方:汇编学习应该首先从8086开始。对于别的语言,这绝对是谬误,没有人承认学习c#必须要有c的基础,云云。造成这种现状的原因是硬件在发展的时候,兼容性是一个非常重要的指标。谁违反,谁就会受罚!看看IBM推出的80286时的尴尬就知道了。在兼容性的指导下,一代又一代的芯片形成了一个兼容链,这个链条的末端一直伸向历史的起点:8086。而在这个之后芯片的工作原理是很简单的,这也自然而然成为了我们学习的一个不错开端。

 

 

好了,今天先到这里!

 

 

 

 

 

原创粉丝点击