ASM会被时代淘汰吗?

2021-11-16 16:22 来源:电子说

最近看了一个热门视频——X天学单片机。内容真的很好理解,制作也很用心。但是有一点我是不同意的,那就是现在C语言已经强大到可以胜任所有的任务了,我们没有必要去学习汇编语言,就从C开始吧。

这种观点似乎有些道理,我甚至怀疑是否真的有很多学生不再学习汇编。尤其是现在大部分厂商都提供了完整的驱动代码,我们基本上不需要为项目编写ASM代码。

ASM要过时了!真的是这样吗?

用两个实际的例子来谈谈掌握ASM语言对于我们编写稳定高效的代码的必要性。

让我们看看代码。主程序翻转POTA的引脚0,定时器中断服务程序翻转POTA的引脚1。乍一看,很难看出哪里出了问题。很多学生都很成功。如果可以控制一些LED指示灯或者蜂鸣器,最多看起来有点乱或者偶尔会发出一些噪音。如果使用控制设备,可能会有大问题。

有什么问题?因为当中断发生时,主程序将在最后一条正在执行的语句执行后停止运行。必须注意,这里的语句不是C语句,而是ASM语句。让我们来看看调试环境中的反汇编。一个C语句被编译成几个ASM语句。

LDRH r1、[r5、#0x14] (1)

EORS r1、r1、r4 (2)

STRH r1、[r5、#0x14] (3)

我们看到一个C语句实际上被编译成三个ASM语句,(1)将PORTA的当前内容读入r1,(2)通过XOR将最低位反相,(3)将反相后的值输出到PORTA。如果中断发生在执行(1)或(2)期间,那么PORTA引脚1上的中断服务程序的操作将被主程序中的语句(3)覆盖。

为了避免这种情况,您可以在操作输入输出端口(或其他类似操作)之前禁用中断,然后在操作之后允许中断。在一些带位图的单片机中,单个管脚的操作可以通过位图区域进行操作,以避免管脚之间的相互影响。

汇编语言的使用也可以大大提高代码的效率。即使现在编译器的效率相当高,毕竟机器还是比人笨一点。

例如,有许多项目需要浮点运算。如果直接调用浮点运算库,可以轻松完成任务。但是有一个限制,就是运算过程总是以最大精度进行运算,浪费了MCU的时间。

我们的应用可能不需要这么高的精度,但是需要尽快完成操作,保持一定的精度。在这种情况下,如果我们使用嵌入式ASM来做运算,可以通过减少迭代运算的次数来快速完成运算(精度与迭代运算的次数成正比)。在分秒必争的发动机控制领域,有时这样做是必要的。

延伸 · 阅读