打印

单片机 C51 怪事 高手看过来

[复制链接]
3133|23
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
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 | 只看该作者
肯定是变量类型定义错误,或者在计算时没加强制转换。

使用特权

评论回复
5
ayb_ice| | 2012-11-5 08:12 | 只看该作者
这一般是中间计算溢出的问题

使用特权

评论回复
6
airwill| | 2012-11-5 10:05 | 只看该作者
temp_word 是不是定义的 8位数?

使用特权

评论回复
7
fesen| | 2012-11-5 10:06 | 只看该作者
:handshake:handshake

使用特权

评论回复
8
dragon20100708| | 2012-11-5 10:07 | 只看该作者
learning

使用特权

评论回复
9
hjs1618| | 2012-11-5 11:33 | 只看该作者
WORD宏定义成什么了?

使用特权

评论回复
10
coody| | 2012-11-5 11:59 | 只看该作者
=(WORD)save_call_in_p * 8

使用特权

评论回复
11
wmhnzz|  楼主 | 2012-11-5 15:10 | 只看该作者
多谢各位,问题已经解决,最终结果是编译器优化等级搞的,而且今天我同事用IAR出现类似的问题
for(i=0;i<10;i++)
{
_nop_();
}
居然只循环2次就结束了,反汇编发现循环控制变量 i 居然用ACC,计算过程与10比较又是用ACC。降低优化等级后,再看反汇编,i用的是R2,问题解决。

使用特权

评论回复
12
wmhnzz|  楼主 | 2012-11-5 15:10 | 只看该作者
提示: 该帖被管理员或版主屏蔽
13
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

使用特权

评论回复
14
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

使用特权

评论回复
15
wmhnzz|  楼主 | 2012-11-5 15:23 | 只看该作者
嗯,现在我怎么弄结果都对了
感觉C51的优化有时还会坏事

使用特权

评论回复
16
HORSE7812| | 2012-11-5 16:12 | 只看该作者
用了10几年的KEIL C,碰到的问题99%以上是自身的原因导致的。

使用特权

评论回复
17
电子write_cai| | 2012-11-5 17:26 | 只看该作者
是的。 15# wmhnzz

使用特权

评论回复
18
azhou126| | 2012-11-5 18:11 | 只看该作者
好好学习

使用特权

评论回复
19
azhou126| | 2012-11-5 18:11 | 只看该作者
好好学习

使用特权

评论回复
20
azhou126| | 2012-11-5 18:11 | 只看该作者
好好学习

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

6

主题

15

帖子

1

粉丝