keil MDK ARM内嵌汇编UMULL指令进行64位乘法运算

最近看了看国嵌的视频,自学ARM体系架构和ARM汇编。看到C\C++与ARM汇编混合使用的时候我就想起了9月份我参加的电子设计大赛,我们组需要AD9854来产生源信号。AD9854的频率字是48位的,所以我试了试MDK的long long,结果真是坑爹,long long竟然是32位的,如下图


keil MDK ARM内嵌汇编UMULL指令进行64位乘法运算_第1张图片




从反汇编译的结果来看,long long是32位的也不奇怪了,因为它根本没保存高位。但是我用sizeof去测试它的长度时得到的结果是8,这就不科学了,我再用h记录freq的高32位时读出来的是乱码,这就验证了long long虽然是8字节,但是实际上在MDK中被编译成4字节的了(个人观点,如果有错请提出,免得误导别人)。

在MDK里揪出来个坑爹的long long,但是问题还没解决。比赛时间有限,我就用分割计算的方法去完成控制字的读写了,但是这个分割计算还是挺麻烦的,我想用个简单的方法在MDK上计算64位乘法,正好我开始学linux了,看到ARM汇编里面有个UMULL指令,是专门完成32位ARM处理器上的64位无符号乘法的,我这时才想起来,曾经在某个论坛上看到IAR的long long反汇编译用的是UMULL,好吧,试试看!

我先用内联汇编编了个函数,结果- -,坑爹  MDK不支持内联汇编,只支持内嵌汇编,那好吧,内嵌就内嵌吧(个人觉得内联看起来舒服有木有)。程序如下图




R0,R1,R2,R3分别对应传入的变量a,变量b,变量h的地址,变量l的地址(为了把值通过指针传回来)

好了,编译通过,来看看debug吧,结果如下图

keil MDK ARM内嵌汇编UMULL指令进行64位乘法运算_第2张图片


高32位h的值是0x428C,低32位l的值是0x731AF080,他们是变量a = 26000000和变量b = 0x2af13d的乘积。


总结下,这篇文章主要是我的现学现卖,来试试内嵌汇编,我也是个新手 = =。MDK还是个不错的编译器,也在我学STM32的时候帮了我不少,虽然有点小瑕疵。愿这篇文章能帮大家解惑,如果我的测试过程有错,请提出来,我会认真听取,积极改正。





你可能感兴趣的:(汇编,64位,mdk)