非常感谢uc_stm32f050和版主的解答,尤其是uc_stm32f050的详解!!!uc_stm32f050功力深厚:D
对比了下汇编代码,发现Keil和IAR的处理方式差异很大,Keil的处理方法似乎太“优化”了些,感觉是先判断了乘数0x100,然后再相应地用最少的代码实现,汇编代码摘录如下:
----------Keil-----------
15: sumvalue3 = addend02*0x100; //4294967040(0xFFFFFF00)
16:
C:0x002F E51A MOV A,addend02(0x1A)
C:0x0031 FE MOV R6,A
C:0x0032 E4 CLR A
C:0x0033 F517 MOV 0x17,A
C:0x0035 8E16 MOV 0x16,R6
C:0x0037 F515 MOV 0x15,A
C:0x0039 F514 MOV sumvalue3(0x14),A
寄存器0x14-17应该是用来存放sumvalue3的,这里就不涉及逻辑运算,只是寄存器和内存的数据搬移和清零
----------IAR-----------
sumvalue3 = addend02*0x100; //4294967040(0xFFFFFF00)
000274 425E 0201 mov.b &addend02,R14
000278 4E4E mov.b R14,R14
00027A F03E 00FF and.w #0xFF,R14
00027E 108E swpb R14
000280 4E0F mov.w R14,R15
000282 E33F inv.w R15
000284 5F0F rla.w R15
000286 7F0F subc.w R15,R15
000288 4E82 0210 mov.w R14,&sumvalue3
00028C 4F82 0212 mov.w R15,&0x212
R14和R15用来存放sumvalue3,应该就是uc_stm32f050所解释的关键。
现在我感觉它们的数据类型都是标准的,只是在运算或者存储时的处理规则不一样,可能正如uc_stm32f050所言,Keil的处理方法有点特别。
另外,查了下第一帖中提到的两个开发环境下的C编译帮助文档,确实就像uc_stm32f050所说的,IAR for MSP430中int是16bit,IAR for ARM是32bit,Keil中是16bit,不过有一点值得注意,IAR中都提到了负数采用补码形式,而keil中并未提及(或者我还没找到),截图如下(IAR for ARM的帮助文档是IAR Embedded Workbench for ARM 5.30 Kickstart环境下的):
----IAR for ARM
----IAR for 430
----KEIL C51
|