大名鼎鼎的keil51,竟然实现不了双字节乘以双字节的简单乘法运算.
我们都知道两个无符号双字节相乘,结果是一个无符号的四字节,但是keil51就认为是相乘的结果是一个双字节,岂有不错之理?
286: along= SetLengthA * FreqValueA;
C:0x1000 78C2 MOV R0,#FreqValueA(0xC2)
C:0x1002 E6 MOV A,@R0
C:0x1003 FC MOV R4,A
C:0x1004 08 INC R0
C:0x1005 E6 MOV A,@R0
C:0x1006 FD MOV R5,A
C:0x1007 78C7 MOV R0,#SetLengthA(0xC7)
C:0x1009 E6 MOV A,@R0
C:0x100A FE MOV R6,A
C:0x100B 08 INC R0
C:0x100C E6 MOV A,@R0
C:0x100D FF MOV R7,A
C:0x100E 12072D LCALL C?IMUL(C:072D)
C:0x1011 E4 CLR A
C:0x1012 8F37 MOV 0x37,R7
C:0x1014 8E36 MOV 0x36,R6
C:0x1016 F535 MOV 0x35,A
C:0x1018 F534 MOV 0x34,A
这其中的那个乘法子程序,我分析过了,就是:int=int*int
哪怕我用一个long型变量来接收结果,编译器也是调用这个子程序,这显然是错误的