汉扬编程 C语言入门 嵌入式C语言中嵌入汇编代码优化实例

嵌入式C语言中嵌入汇编代码优化实例

我们在实际编程过程中,有时候为了做针对硬件级的加速,我们会采用在C语言中嵌入汇编代码的方式来达到加速优化的目的。

还是以实际项目为例,比如我们在做射频通信时,为了通信安全,都需要针对传输的数据做加密传输,也就是需要用到编解码,这里我们就来看一下其中的解码函数Decrypt()。

解码函数Decrypt()实际上只是复杂但并不高深,基本上就是一大堆旋转与互斥的运算,每个芯片厂商都可以有自己的算法标准。Decrypt()存在很多特殊的位运算,比如半字节旋转运算和字循环位移运算等。因此,我们可以针对Decrypt()中经常需要调用的位运算做特别优化。

半字节旋转运算

半字节旋转,也就是将一个8位字节数的前4位与后4位相互交换位置,一般C语言的做法是

aux = (aux << 4) | (aux >> 4);而汇编语言针对8位寄存器的基本做法是

asm("mov a,aux;");asm("rol a,1;");asm("rol a,1;");asm("rol a,1;");asm("rol a,1;");asm("mov aux,a;");更高效的做法是,芯片有专门的指令支持这种特殊运算

asm("swapf _aux,f");显然最后这种做法是最高效的,第二种做法看起来比第一种做法的语句要多,但是在运行速度上并不比C代码慢。因为C代码还是需要先生成汇编代码,再转换成对应的机器码,最后才能在芯片中运行的。

字循环位移运算

我们再来看一下,Decrypt()中32位字的循环位移运算,这里移循环左移为例,一般C语言的做法是

Buffer.Word <<= 1;if (aux & 0x80){ Buffer.Word |= 0x1;}而汇编语言针对8位寄存器的基本做法是

asm("mov a,aux;");asm("rolc a,1;");asm("mov a,Buffer;");asm("rolc a,1;");asm("mov Buffer,a;");asm("mov a,Buffer+1;");asm("rolc a,1;");asm("mov Buffer+1,a;");asm("mov a,Buffer+2;");asm("rolc a,1;");asm("mov Buffer+2,a;");asm("mov a,Buffer+3;");asm("rolc a,1;");asm("mov Buffer+3,a;");更高效的做法是,芯片有专门的指令支持带溢出位运算

rlcf _aux,wrlcf _Buffer,frlcf _Buffer+1,frlcf _Buffer+2,frlcf _Buffer+3,f显然最后这种做法也是最高效的。通过这种对比,实际上我们就了解了汇编加速的原理。

小结

在C语言中嵌入汇编代码,往往是基于硬件优化加速的考虑,特别适用于复杂算法的运算实现和拥有特殊指令集的芯片。

本文来自网络,不代表汉扬编程立场,转载请注明出处:http://www.hyzlch.com/cjia/5879.html

各位c语言高手帮帮忙 用c语言编写程序

Protobuf 小试牛刀

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注

返回顶部