在编程语言越来越高级的情况下程序员学习汇编有什么意义

2019-11-04 12:35:23

嵌入式电工来回一个吧。当年学微机原理时,学过x86的汇编,考完试就全忘了;学单片机时,学过8051的汇编,毕业两年后就忘了;ARM的汇编,v4和Thumb-2比较熟;DSP的汇编,TI的C54xx比较熟。其实所谓的全忘指的是指令集忘了,不同片子的汇编,规则还是一样的。比较熟是指熟到什么地步呢。ARM——调试底层时,遇到奇怪的问题,打开Disassembly查看反汇编代码,基本都能看得懂,偶尔会有几个指令不认识,翻翻指令集就能看明白,但没写过;DSP——写过几个大量计算的函数,本来用C写的,但发现太耗时间,就改用ASM,一边翻指令集一边写。以上算是背景介绍,现在回答问题,学习汇编有什么意义?以下回答只针对嵌入式软件,非嵌入式,不是不想回答,只是不懂,不敢乱答。1、某些特殊环境,必须要用。比方说前几年中颖的MCU就不支持C,几年过去了,现在支不支持不清楚,不过即便8位机支持了,想必4位机还是不支持的。(这个几年没接触了,不太了解,但这个是最刚性的一个理由。)2、你说不支持C太low了。好吧,我们用支持C的,调试底层,会遇到一些奇怪的、无厘头的问题,得打开反汇编窗口,看看硬件是怎么执行的,必要时还要在汇编层面单步执行,一次只执行一条汇编指令。举个例子,变量out映射到某个pin了,你要在这个pin上产生一个下降沿,你就写了句out=1;out=0;但是运行起来,却只有低电平,没有下降沿,why?看看汇编吧,out=1没了!被编译器优化掉了,根本没执行。。。。好吧,我们加个volatile。3、裸跑太不爽了。那行,我们移植个OS吧,复杂点就Linux,简单点就μCos,汇编又跑出来了。。。。在执行main之前我们得分配好内存,安排好中断向量表,放好heap和stack;进入main了,任务切换,要保存现场,要更新寄存器,还得靠汇编。4、底层太麻烦了,我们直接搞应用层。OK,做个信号处理吧,AD采集了大量数据,要求差分,要算频谱,要做滤波,计算量太大,用while用for都可以,但时间。。。。还是用汇编吧。当然,此处不仅仅是将C改成汇编,因为都用汇编了,而是只是一个单进程,纯运算的函数,就不考虑可移植性了,我们可以将其他的优化都用上,比方以位移代乘除,以空间换时间,总之一切都是为了提高效率。据我本人经历,最高的一次是将函数运行时间缩小了20倍。20倍什么概念?要是不用优化,老老实实用C的话,按照摩尔定律十八个月翻一番,你得要六年才能增长16倍。。。。当然换个好的算法更好,但你C用的算法,ASM也能用啊,还是比你快。5、好吧,最后不谈实际应用。即便真不写、不看汇编,汇编也是有用的,学汇编的过程就是理解计算机的过程。不告诉你CPU的控制流、数据流,学一堆寄存器、累加器的名词有用么?用语言描述也可以,“将寄存器A出栈”,这不就是“POPA”吗?只不过你自己typedef了一套汉语描述的、不完整的指令集罢了。那学计算机原理有什么用呢?还是跟上面回答一样,一是底层,二是效率。比方说写个bootloader,不考虑可移植性,启动代码有现成的,那用C写也可以,但你起码得明白啥叫中断向量表,程序要怎么跳转吧。

上一篇:内蒙古5月1日起撤消二级公路收费
下一篇:2017年7月15日起武汉交通管制通知