ASM会被时代淘汰吗?
最近看了一个热门视频——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来做运算,可以通过减少迭代运算的次数来快速完成运算(精度与迭代运算的次数成正比)。在分秒必争的发动机控制领域,有时这样做是必要的。
延伸 · 阅读
- 2021-11-16 16:22利用RC4和RSA混合加密实现蓝牙遥控功能
- 2021-11-16 16:22Google计算平台将优化数据中心中的可再生能源使用
- 2021-11-16 16:22Lura Health 开发一种能佩戴在一颗牙齿上的微型传感器
- 2021-11-16 16:22数据中心技术趋势:计算机的历史是数据中心的未来
- 2021-11-16 16:22海思麒麟处理器出货首次登顶;京东方:2019营收同比增长1
- 2021-11-16 16:22华为获5G世界最佳测试测量技术奖