首页
社区
课程
招聘
[分享]说说汇编
发表于: 2016-5-1 19:24 3761

[分享]说说汇编

2016-5-1 19:24
3761
最近有不少汇编初学者来问笔者:汇编怎么学?先学汇编还是先学C?汇编学了有什么用?学了汇编对理解编程有帮助吗?笔者接触汇编也不过两三年,写不出高深的文章,但是笔者也是过来人,也曾遇到过这些问题,笔者希望用通俗的语言给读者讲解我是如何看待这些问题的。注意这是春节在高速路上堵着无聊之作。

首先,恭喜你,知道”汇编”这个名词已经说明你对计算机有一定的了解程度,你想通过学习”汇编”这个途径来深入了解计算机的运作原理。”深入了解计算机运作原理”这个概念很泛,学习汇编最多是让你了解软件层面的原理,以及如何利用硬件罢了。然而计算机是由硬件和软件组成,汇编是汇编,硬件是硬件.就算你汇编再牛,你也有可能完全不知道什么是冯诺依曼,哈佛,什么是流水线,MMU,什么是段页式,什么是三态门。汇编,只是众多工具中的一种,它很重要,但只是对机器而言,对程序员来说,未必.一个写Android APP的工程师不懂汇编也能开发出很好的应用,一个写协议栈的工程师不懂汇编也能做出很优雅的协议.对于大部分的程序员来说,了解,是他们对汇编最高的理解层次,从进化论的角度来讲,这可能就说明了汇编对非BSP的程序员来说并不是十分重要.

所以,想学习硬件原理,汇编或许不是很好的途径。

汇编有很多种,不同的处理器都有一套自己的汇编语言,我们该如何选择? 如果你想做一名Windows平台安全工程狮,那么就需要学习x86汇编,因为Windows是运行在x86架构上的操作系统。x86又有16位,32位,64位,看着心都凉了半截。前辈认为我们应该从8086汇编开始学,8086汇编实际上就是16位的x86汇编。虽然现在8086处理器已经绝种了,但是我也认为应该从8086开始学习。相比32位的x86,16位更加简单,很容易学的,而且16位的汇编是32位的一个子集,学了并不是一无用处。在学习32位汇编时就很轻松,你会有一种海阔天空,会当云绝顶的感觉。地址空间从1M变成4G的,就像你一夜暴富一样。再也不用仔细考虑小运算是否会溢出。。。x86  32位引入了保护模式,引入了分页机制,这是实现现代操作系统的基础,大家学有余力可以深入了解,如果是定位是内核工程狮,那么这些就是基本功了。假如有一天你对你家的路由器感兴趣了,你想对它进行XXOO,那么你有可能需要学习MIPS汇编 ,市场上的大部分路由是MIPS架构的 。还是有些人,比较喜欢非主流,去跑去学习一些根本触碰不到的东西,往往只能纸上谈兵,挂载到嘴上,吹几个牛逼罢了,其实我是想说学习自己需要的方面,不要把精力浪费在没用的方向。有些人对我说汇编算个什么卵,用机器码编程的才牛逼,对于这种人,我也只有呵呵呵的笑。

在学习完一门汇编语言后再去学习其他平台汇编就会很容易了,或许只要一周一天甚至几个小时就能掌握新的汇编语言,笔者学习arm汇编时就是这样的。这是因为汇编难,是难在汇编生硬的思想,汇编简单,是指令简洁,比起学习一门高级语言容易很多!汇编是枯燥的,但是汇编代码能更好的体现一个人的思维!目标使你看清使命,产生动力!这句话很赞,特别适合汇编初学者,如果没有目标,你就像是无头苍蝇一样,找不着北。我有个朋友,三年前认识的,这位朋友看我写汇编代码觉得很牛逼,就让我教他。 我愉快的答应了并且还给了他《汇编语言》这本神书,然而他没有目标,三年后,前几天的事情吧,他依然在问我如何搭建汇编环境,怎么用OD。 这就是没有目标造成的,对汇编盲目崇拜,学习汇编不是因为别人也学习了汇编。

如何定目标? 对于极客来说,DIY什么的再好不过了,这和汇编有什么关系呢? 学习汇编,你能编写自己的“操作系统”,虽然称它为“操作系统”有点过了,当这何尝不是一种鼓励呢?别人问你为什么学习汇编,你回答说:"我研究系统内核的!" 档次瞬间就上去了。 编写“操作系统”的乐趣很多啊,笔者也是开发过自己的“操作系统”黑漆漆的屏幕上输出了历史性的“Hello world”,第一次读取硬盘,访问神秘莫测的显存,都充满了无限的乐趣。学习汇编可以赚钱!可以赚钱!可以赚钱!是的我没有开玩笑,但是这似乎有些不符合**的法律,仅供参考。赚钱其实只是为了吸引你的眼球罢了,做技术的,就不应该把金钱放在第一位! 对于做逆向来学,汇编是基础功,对汇编的熟练程度决定了你在工作岗位是否吃香。吾爱论坛也有很多用RMB求破解的,作为一名Cracker,对汇编的熟练程度也直接决定了你的吃香程度。为什么有人愿意花大价钱求破解?因为汇编难啊,算法难啊,他们看不懂啊,而你掌握了核心技术,你看得懂啊,这些就是给你送钱的啊。偶尔写一篇破文发在吾爱看雪,骗一篇精华不是挺有成就感的吗?

学习汇编能帮助理解编程?这个论点是正确的!但是对于解释性的脚本语言来说就有点不适用了,因为脚本都是解释执行的,解释器是中介 。你学习了汇编,C语言中的指针对你来说只能算是小菜。你会感叹用着C指针好幸福啊! 如果此时你在去用一些高级内存管理,什么垃圾回收一类的,你会感觉好繁琐好繁琐! 如今编译优化很牛逼了,偷梁换柱,移星大法的事情是很常有的,要调试这样的代码是很蛋疼,有时候你根本找不到出错的原因,这时候你就需要对程序进行反汇编,从汇编的角度思考你的程序。BUG常有,而Debugger不常有。Debugger指的是调试技术很精湛的人。所以学习汇编能增加你的调试技术,早日成为调戏师!不过换句话说,你总会在某些黑暗的地方被迫阅读汇编代码..........还有一点好处便是你在写代码的时候随时都会从汇编的角度来考虑代码的效率问题。学了汇编可以盗窃别人的智慧啊,说好听的我们是借鉴别人的智慧,学习别人的智慧,这和法律并不冲突,比如哪天你发现一个压缩算法好牛逼啊,可以将1G压缩成10M,然而这个软件又是闭源软件,甚至是收费软件,这时候就能通过逆向分析的手段来破解这个程序,或者用逆向分析的手段来学习压缩算法的原理,最后你的智商爆表或者受到祖上仙人保佑,你研究出可以将1G压缩到1M的超级逆天级算法,得了图领奖务必请我吃饭。

来一个大跳跃吧。比如有一天你看到了这种反人类的代码: a[i]=i++ 你会如何思考?一般程序猿会想,应该是先算 a[i] 的地址吧,一些学过一点汇编的人可能会想,应该从右边开始计算吧?CPU寄存器就那么几个,按照运算顺序貌似符合逻辑。但是这条语句在不同编译器下编译的结果是千奇百怪的,所以还是得需要通过反汇编,来看编译器是如何来编译a[i]=i++这句代码的。学习汇编!不要被编译器蒙蔽了双眼!

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (3)
雪    币: 441
活跃值: (46)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
2
写得好,机器码和汇编指令是一一对应的吧
2016-5-1 19:35
0
雪    币: 55
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
学习汇编我觉得就是要不断的去写不断的找软件找程序看
看多了写多了就成高手了
2016-5-1 19:37
0
雪    币: 4
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
我想知道编译器是如何来编译a[i]=i++?
2016-5-1 20:25
0
游客
登录 | 注册 方可回帖
返回
//