单片机 C51 怪事 高手看过来

[复制链接]
 楼主| wmhnzz 发表于 2012-11-4 21:45 | 显示全部楼层 |阅读模式
今天用KEIC 4编个程序

计算个乘法
temp_word=(WORD)(save_call_in_p*8)+CALL_IN_RECORD_ADDR;

是算一个存储器的地址,save_call_in_p是记录位置,取值0
CALL_IN_RECORD_ADDR是首地址,0X1200,上面算出来的结果居然是
0X1212

在线等候
 楼主| wmhnzz 发表于 2012-11-4 22:55 | 显示全部楼层
通过看反汇编程序,原因已经找到,但是不明白KEIL C怎么能这样乱编译,高手请过来下,
MUL AB之后,连B都不去管了,还乱+一气
   467:         temp_word=save_call_in_p*8+CALL_IN_RECORD_ADDR;
   468:  
   469:  
C:0x4480    E534     MOV      A,save_call_in_p(0x34)
C:0x4482    75F008   MOV      B(0xF0),#used_map_bit_index_last(0x08)
C:0x4485    A4       MUL      AB
C:0x4486    2412     ADD      A,#WG_timer(0x12)
C:0x4488    FF       MOV      R7,A
C:0x4489    EF       MOV      A,R7
C:0x448A    755100   MOV      0x51,#0x00
C:0x448D    F550     MOV      0x50,A
 楼主| wmhnzz 发表于 2012-11-4 22:57 | 显示全部楼层
没人来?
Cortex-M0 发表于 2012-11-5 06:18 | 显示全部楼层
肯定是变量类型定义错误,或者在计算时没加强制转换。
ayb_ice 发表于 2012-11-5 08:12 | 显示全部楼层
这一般是中间计算溢出的问题
airwill 发表于 2012-11-5 10:05 | 显示全部楼层
temp_word 是不是定义的 8位数?
fesen 发表于 2012-11-5 10:06 | 显示全部楼层
:handshake:handshake
dragon20100708 发表于 2012-11-5 10:07 | 显示全部楼层
learning
hjs1618 发表于 2012-11-5 11:33 | 显示全部楼层
WORD宏定义成什么了?
coody 发表于 2012-11-5 11:59 | 显示全部楼层
=(WORD)save_call_in_p * 8
 楼主| wmhnzz 发表于 2012-11-5 15:10 | 显示全部楼层
多谢各位,问题已经解决,最终结果是编译器优化等级搞的,而且今天我同事用IAR出现类似的问题
for(i=0;i<10;i++)
{
_nop_();
}
居然只循环2次就结束了,反汇编发现循环控制变量 i 居然用ACC,计算过程与10比较又是用ACC。降低优化等级后,再看反汇编,i用的是R2,问题解决。
 楼主| wmhnzz 发表于 2012-11-5 15:10 | 显示全部楼层
提示: 该帖被管理员或版主屏蔽
HORSE7812 发表于 2012-11-5 15:12 | 显示全部楼层
unsigned int test(void)
{
        unsigned int                save_call_in_p=0;
        unsigned int                CALL_IN_RECORD_ADDR=0x1200;
        unsigned int                 temp_word;

        temp_word=(unsigned int)(save_call_in_p*8)+CALL_IN_RECORD_ADDR;
        return(temp_word);
}

我的MDK 4.22结果是0X1200
HORSE7812 发表于 2012-11-5 15:16 | 显示全部楼层
#define        CALL_IN_RECORD_ADDR                0x1200
unsigned int test1(void)
{
        unsigned char                save_call_in_p=0x00;
        unsigned int                 temp_word;

        temp_word=(unsigned int)(save_call_in_p*8)+CALL_IN_RECORD_ADDR;
        return(temp_word);
}
这样也是0x1200
 楼主| wmhnzz 发表于 2012-11-5 15:23 | 显示全部楼层
嗯,现在我怎么弄结果都对了
感觉C51的优化有时还会坏事
HORSE7812 发表于 2012-11-5 16:12 | 显示全部楼层
用了10几年的KEIL C,碰到的问题99%以上是自身的原因导致的。
电子write_cai 发表于 2012-11-5 17:26 | 显示全部楼层
是的。 15# wmhnzz
azhou126 发表于 2012-11-5 18:11 | 显示全部楼层
好好学习
azhou126 发表于 2012-11-5 18:11 | 显示全部楼层
好好学习
azhou126 发表于 2012-11-5 18:11 | 显示全部楼层
好好学习
您需要登录后才可以回帖 登录 | 注册

本版积分规则

6

主题

15

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部

6

主题

15

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部