谈汇编
作者:无名侠最近有不少汇编初学者来问笔者:汇编怎么学?先学汇编还是先学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的,就像你一夜暴富一样。再也不用仔细考虑小运算是否会溢出。。。x8632位引入了保护模式,引入了分页机制,这是实现现代操作系统的基础,大家学有余力可以深入了解,如果是定位是内核工程狮,那么这些就是基本功了。假如有一天你对你家的路由器感兴趣了,你想对它进行XXOO,那么你有可能需要学习MIPS汇编 ,市场上的大部分路由是MIPS架构的 。还是有些人,比较喜欢非主流,去跑去学习一些根本触碰不到的东西,往往只能纸上谈兵,挂载到嘴上,吹几个牛逼罢了,其实我是想说学习自己需要的方面,不要把精力浪费在没用的方向。有些人对我说汇编算个什么卵,用机器码编程的才牛逼,对于这种人,我也只有呵呵呵的笑。
在学习完一门汇编语言后再去学习其他平台汇编就会很容易了,或许只要一周一天甚至几个小时就能掌握新的汇编语言,笔者学习arm汇编时就是这样的。这是因为汇编难,是难在汇编生硬的思想,汇编简单,是指令简洁,比起学习一门高级语言容易很多!汇编是枯燥的,但是汇编代码能更好的体现一个人的思维!目标使你看清使命,产生动力!这句话很赞,特别适合汇编初学者,如果没有目标,你就像是无头苍蝇一样,找不着北。我有个朋友,三年前认识的,这位朋友看我写汇编代码觉得很牛逼,就让我教他。 我愉快的答应了并且还给了他《汇编语言》这本神书,然而他没有目标,三年后,前几天的事情吧,他依然在问我如何搭建汇编环境,怎么用OD。 这就是没有目标造成的,对汇编盲目崇拜,学习汇编不是因为别人也学习了汇编。
如何定目标? 对于极客来说,DIY什么的再好不过了,这和汇编有什么关系呢? 学习汇编,你能编写自己的“操作系统”,虽然称它为“操作系统”有点过了,当这何尝不是一种鼓励呢?别人问你为什么学习汇编,你回答说:"我研究系统内核的!" 档次瞬间就上去了。 编写“操作系统”的乐趣很多啊,笔者也是开发过自己的“操作系统”黑漆漆的屏幕上输出了历史性的“Hello world”,第一次读取硬盘,访问神秘莫测的显存,都充满了无限的乐趣。学习汇编可以赚钱!可以赚钱!可以赚钱!是的我没有开玩笑,但是这似乎有些不符合天朝的法律,仅供参考。赚钱其实只是为了吸引你的眼球罢了,做技术的,就不应该把金钱放在第一位! 对于做逆向来学,汇编是基础功,对汇编的熟练程度决定了你在工作岗位是否吃香。吾爱论坛也有很多用RMB求破解的,作为一名Cracker,对汇编的熟练程度也直接决定了你的吃香程度。为什么有人愿意花大价钱求破解?因为汇编难啊,算法难啊,他们看不懂啊,而你掌握了核心技术,你看得懂啊,这些就是给你送钱的啊。偶尔写一篇破文发在吾爱看雪,骗一篇精华不是挺有成就感的吗?
学习汇编能帮助理解编程?这个论点是正确的!但是对于解释性的脚本语言来说就有点不适用了,因为脚本都是解释执行的,解释器是中介 。你学习了汇编,C语言中的指针对你来说只能算是小菜。你会感叹用着C指针好幸福啊! 如果此时你在去用一些高级内存管理,什么垃圾回收一类的,你会感觉好繁琐好繁琐! 如今编译优化很牛逼了,偷梁换柱,移星大法的事情是很常有的,要调试这样的代码是很蛋疼,有时候你根本找不到出错的原因,这时候你就需要对程序进行反汇编,从汇编的角度思考你的程序。BUG常有,而Debugger不常有。Debugger指的是调试技术很精湛的人。所以学习汇编能增加你的调试技术,早日成为调戏师!不过换句话说,你总会在某些黑暗的地方被迫阅读汇编代码..........还有一点好处便是你在写代码的时候随时都会从汇编的角度来考虑代码的效率问题。学了汇编可以盗窃别人的智慧啊,说好听的我们是借鉴别人的智慧,学习别人的智慧,这和法律并不冲突,比如哪天你发现一个压缩算法好牛逼啊,可以将1G压缩成10M,然而这个软件又是闭源软件,甚至是收费软件,这时候就能通过逆向分析的手段来破解这个程序,或者用逆向分析的手段来学习压缩算法的原理,最后你的智商爆表或者受到祖上仙人保佑,你研究出可以将1G压缩到1M的超级逆天级算法,得了图领奖务必请我吃饭。
来一个大跳跃吧。比如有一天你看到了这种反人类的代码: a=i++ 你会如何思考?一般程序猿会想,应该是先算 a 的地址吧,一些学过一点汇编的人可能会想,应该从右边开始计算吧?CPU寄存器就那么几个,按照运算顺序貌似符合逻辑。但是这条语句在不同编译器下编译的结果是千奇百怪的,所以还是得需要通过反汇编,来看编译器是如何来编译a=i++这句代码的。学习汇编!不要被编译器蒙蔽了双眼!
有的人可能还担心自己太老不适合学习汇编。其实并不是这样的,你看看教汇编的教授哪个不是老骨头啊,汇编下至6岁上至80岁都适合学习!我在知乎看到一篇比较有趣的文章:
如何引导7岁的儿童学习汇编? -> https://www.zhihu.com/question/20905254
我表示佩服!我妹妹6岁,在我的引导下3岁就开始接触计算机,现在充其量能打几个字而已。
支持一下 还有最后一句话我表示膜拜{:10_256:} 写的不错 支持一下汇编贵在坚持前阵子学了一半这阵子纠结是从头学还是从一半学 好文章{:10_256:}{:10_257:}{:10_254:} 坚持学,深入学 本帖最后由 宝贝归来 于 2016-4-15 10:33 编辑
我这一阵子也在规划方向,计划着学完python之后是学习C语言还是汇编,因为自己本身就是电子系的,硬件方面虽然不会,但起码和外行人比较起来还是懂一些的,
虽说学技术的不要为钱而学,但生活、工作也是人生的很大一部分,要考虑到以后这个行业是否有发展的前途,努力工作5年后年薪能否在30万以上,毕业了之后要能养活自己、衣食无忧、当然了、还要照顾父母家人、爷爷奶奶、2年后结婚也要准备一笔不小的费用,能否买上一个大房子,让自己的老婆孩子过得更好!
以下是我在其它论坛上看的一些材料,
比如说:工作有两个方向:
1.从事硬件工作(智能家居、汽车电子等):有研发周期,每个新品完成之后会有一段时间可以修整、继续学习、年薪也可以在7、或8年后达到30万,未来可以升级为研发部门的管理层。
2.从事软件工作,朝九晚五,有双休,每天整理代码,维护BUG,每天都得盯着电脑(视力下降),年薪在5年后大概可以达到20万,但是软件行业的工具发展的太快,需要不断的学习,而且,大部分都是年轻人(其实我也只是听说),大概年纪大了之后力不从心吧(个人狭隘的见解)。
虽然没有下结论,但我想试着从汇编开始学。{:9_239:} 好文章 之前好像在哪看过,记不太清楚了 瞎bb 刚开始接触汇编,学到一半了,有些问题和实验能卡个一天半天的,不过解决了后边也学得稳,加油!!{:10_264:} 你妹妹6岁,在我的引导下3岁就开始接触计算机,最后我开始教她二进制 天天01010101010101010101010 找到方向 好文 找一找动力!
汇编只是浅浅的学过一遍,对于很多高手说到的“用汇编的思维思考问题”不是很能理解,也许是碍于对汇编的理解尚浅,对程序接触的还少吧!{:10_269:} 最后一句让我倍感欣慰!学习是孤独的,痛苦的~ 但是物极必反,我深信不疑! 推 拜读了
页:
[1]