学习汇编语言有什么好处?
好多初级单片机都是用汇编,也有的可以用C写,编译再转成汇编代码。就个人经验,学习汇编语言可以从最底层理解微机的工作原理,细微到一个状态位放在哪一个存储区,系统怎么轮询,指令和数据之间如何互动,真正把电路逻辑和代码内容衔接起来。然后再学到C,发现每一条C语言语句是这样对应汇编的指令的,有种我能洞悉这块芯片的所有秘密的感觉有没有!(ps举单片机为例子,可能不大适用,不过普通计算机无非是在组成上更复杂一些吧。。)
汇编对能让你理解高级语言。当然不是你学完就能理解,要你自己慢慢研究或继续学习。学习了汇编,不仅仅在于学习了汇编语言,而也学习了计算机处理指令的方式。只是处理指令方式不是计算机工作方式。汇编可以优化程序。我不知道在java中是否可以,但是在C++中可以,但是要注意兼容性。软件调试,也需要了解。反汇编分析。有些程序必须了解汇编语言,比如游戏机的模拟器。都不是用Intel处理器,但是大部分用的是Z80和68000。
现在编译程序对CPU支持性都很好,大部份不需要特别使用Assembly做优化,编译程序转译成Assembly产生的指令效能己经不错,不应该浪费长时间去撰写,只为增加少量的效能,直接使用高级语言开发可以把时间花费在更重要的部份,除非是新的CPU有些新的指令集编译程序还未支持,才需要撰写Assembly去开启功能,或是觉得有一小段代码需要高效能,也可以考虑使用inlineassembly撰写于高级语言中,学习撰写Assembly是必要的,但真正在写代码时,要懂得软件效能和开发时间的取舍才是正道。
纯计算机式思维理解问题(如程序运行中,内存中的堆栈状态、cpu寄存器状态等)c也很底层,但是我不认为完全不懂汇编的c程序员可以做到纯计算机式思维理解问题,即使操作系统大部分是用c写的。
汇编更接近机器语言,能更好的理解机器的运作,据我所知嵌入式行业会运用比较多。应该和底层经常打交道的行业会常常接触汇编。其他行业接触汇编不多,但是了解汇编个人认为相对于不懂汇编的人会更具优势。汇编更好的帮我理解了程序的运作,有时候我会将写好的程序转换成汇编以理解内部的运作,这样会发现一些单步调试都无法发现的问题。个人感觉更多的是方便理解你的程序吧,当然嵌入式等底层行业汇编就是基础了。
汇编和JAVA这种高级语言之间的差别实在是太大,直接影响应该是没有。如果是C的话,还能对应起来。看过很多人说过,学习汇编最大的好处就是理解机器的执行过程,从自身的经验来说,确实是这样。用汇编写一个链表结构,很容易就能理解C里的链表是怎么工作的了,尤其是对于指针的理解会更深刻。
我觉得吧,汇编可以锻炼你在条件有限的情况下处理问题的能力。因为指令就那么多条,在高级语言里面可能一句简单的加法你都要用好几条汇编指令完成。其实吧,我觉得既然现在的编程语言都被证明是图灵等价的,那也就不存在那种语言能做,另一种语言不能做的事情了,只不过实现起来是不是优雅简洁。当然了解学习一下是很有好处的,越是精简的东西越能体现思维性,比如只有黑白二色的围棋却能有无穷的变化。但是倒不一定要去执着于用汇编去写所有代码,仅在优化的地方或者bootloader里面写写,毕竟代码的可读性也很重要,在这一点上汇编就略逊一筹。
帮你理解计算机体系结构。如果你认真学一遍x86的汇编,你会发现“计算机体系结构”和“操作系统”这两门课学起来会非常容易。同时,对于你理解高级语言中,诸如指针啊、栈啊、堆啊,这些基础概念有帮助。对于学习JAVA来说,没有直接的作用。但有一些新手往往对引用和对象的关系,引用传递和值传递搞不清楚,如果你知道c中的函数编译成汇编是什么样子,你就会自然而然的理解这些概念了。从另一方面来说,多掌握一些知识总是有用的,就算你不会直接用到它。比如说,如果你在高中时候就接触一些大学课程,那么你会发现高中课本中的那些知识点真的是太容易了。虽然俗话说“杀鸡焉用牛刀",但会用”牛刀“的人,反过来用“杀鸡刀”不是更加游刃有余么。
汇编是一种一通百通的东西可能你工作中用像你说的高级语言,永远用不到汇编但是汇编能让你知其然知其所以然就跟你学音标一样,不会音标也不妨碍你说英语,但是可能没那么标准,也不知道为什么会这么发音,偶尔一天碰上陌生的单词就跪了。
作为一个老工程师,在工作的过程中,大约以下几个地方用到汇编:一、bootloader。我第一次接触汇编,当时要做一个国半的板的bootloader。我花了几天去学linux的bootloader,最后成功移植到公司的板上。那激动,别提了。后面还做了一个16位色的启动画面,做一个进度条,当时觉得挺有成就感的。二、从那以后,我有意识的经常去反汇编看看编译出来的代码。在我学习C++的时候,曾有的基础让我一下子理解了虚函数的本质。三、做嵌入式开发的时候,在一些性能要求比较高的场合,常常是C和汇编混编的。即使不用混编,对汇编的深入理解,能让你知道怎么组织你的代码,以得到效率和可读性的平衡。四、破解。破解是必须理解汇编的,在感兴趣的时候,我们曾经通过挂钩,将一个程序里未加密的数据给读出来了。五、这个属于轶事了。在我刚参加工作那会,公司有款产品,一个terminal程序,居然全是汇编写的,而且模块化还非常好。据说有个大牛在封闭开发的时候闲极无聊,一晚上用汇编开发了个俄罗斯方块自己玩。余生也晚,对此等牛人只能膜拜…嗯,就酱紫,很多年没写代码了,基本忘光了,悲哀
以前用fasm汇编做过些win32程序。可以说,汇编语言很有其特殊性,高级语言的一些抽象的概念,都被归一和具象化了,C语言的指针,在汇编的世界里简直不值一提,因为地址,对地址的引用再平常不过了。另一方面,内存,缓存,寄存器,CPU,又构成了一个奇妙的世界,它们屏息恭立,静待主公的每一条喻令。我不相信,一个人用纯手工一条条指令去雕琢他的程序,用手指感受计算机的呼吸时会无动于衷。
在我将近10年的嵌入式编程的实践过程中,真正使用汇编的地方并不多。尤其是ARM这样使用地址空间操作寄存器的方式,大部分代码都可以用C完成,汇编的技能主要用于:1、阅读bootloader代码:基本上,除了OS的核心部分有汇编代码以外,bootloader的一部分一般是由汇编代码完成,能读懂这些代码对体系架构的理解和设备启动的流程都很有帮助。2、分析问题:现在编译器优化的很厉害,生成的代码和C代码有时很难又严格的对应,所以在单步跟踪某些问题的时候,需要能够看懂一些汇编语句来分析程序真正执行的流程。3、性能:大部分时候编译器的优化已经够好,我们手写的汇编的效率未必比他高,但是有些特定的场景,我们可以通过汇编调用CPU的专用硬件指令来进行优化。我对我自己对汇编的要求就是能看懂和分析,不要求能够编写复杂的汇编程序。而且汇编大部分是相同的,掌握一种,另一种可以猜个十之八九。
学汇编不是说一定要用这玩艺做多牛鼻的事情,问题的关键在于,学透了汇编会使你真正理解计算机另外一方面,如上面所说,在工作中你迟早会在某个阴暗的角落遇到汇编.不管你承认不承认,现在的CPU没有直接跑高级语言的,哪怕是虚拟机也都是类似汇编的指令集.当遇到崩溃分析,性能优化甚至编译器抽风等等的时候,汇编是你最后一根救命稻草.
回答请先登录