打印

keil c语言程序,局部变量调用定义的全局变量的空间?

[复制链接]
2720|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
angler001|  楼主 | 2012-5-9 21:03 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
c语言程序如下:

  pwmValueTemp[3 * calculationGroupFlag - 3] = vaNumA;   //将计算结果输入,临时存放,等待输出
  pwmValueTemp[3 * calculationGroupFlag - 2] = vaNumB;
  pwmValueTemp[3 * calculationGroupFlag - 1] = vaNumC;

keil的汇编:

   475:                 pwmValueTemp[3 * calculationGroupFlag - 3] = vaNumA;            //将计算结果输入,临时存放,等待输出
C:0x09D6    E54E     MOV      A,calculationGroupFlag(0x4E)
C:0x09D8    75F003   MOV      B(0xF0),#0x03
C:0x09DB    A4       MUL      AB
C:0x09DC    2464     ADD      A,#0x64
C:0x09DE    F8       MOV      R0,A
C:0x09DF    A651     MOV      @R0,vaNumA(0x51)
   476:                 pwmValueTemp[3 * calculationGroupFlag - 2] = vaNumB;
C:0x09E1    E54E     MOV      A,calculationGroupFlag(0x4E)
C:0x09E3    75F003   MOV      B(0xF0),#0x03
C:0x09E6    A4       MUL      AB
C:0x09E7    2465     ADD      A,#countNum(0x65)
C:0x09E9    F8       MOV      R0,A
C:0x09EA    A652     MOV      @R0,vaNumB(0x52)
   477:                 pwmValueTemp[3 * calculationGroupFlag - 1] = vaNumC;
   478:                  
C:0x09EC    E54E     MOV      A,calculationGroupFlag(0x4E)
C:0x09EE    75F003   MOV      B(0xF0),#0x03
C:0x09F1    A4       MUL      AB
C:0x09F2    2466     ADD      A,#0x66
C:0x09F4    F8       MOV      R0,A
C:0x09F5    A653     MOV      @R0,vaNumC(0x53)


countNum是一个全局变量,用来计数,整体的计算次数,可是此处就会把这个变量的值给改变了,为什么会出现这种情况呢?怎么避免?

相关帖子

沙发
ejack| | 2012-5-10 07:51 | 只看该作者
……表害怕,Keil还没bug到这种程度。LZ对汇编的理解有问题啊……

ADD      A,#countNum(0x65)
等价于
ADD      A,#0x65
而不是
ADD      A,countNum

Keil反汇编时会按类型将立即数替换成对应地址的全局符号名。因为反汇编的时候它无法判断你要操作的立即数究竟是地址还是内容。

使用特权

评论回复
板凳
angler001|  楼主 | 2012-5-10 08:05 | 只看该作者
2# ejack

可问题是它会修改全局变量的值,可能是因为定义的变量太多了,数组的地址总是变化的,不知道怎么解决。

使用特权

评论回复
地板
angler001|  楼主 | 2012-5-10 09:05 | 只看该作者
2# ejack


C:0x09E7    2465     ADD      A,#countNum(0x65)
C:0x09E9    F8       MOV      R0,A
C:0x09EA    A652     MOV      @R0,vaNumB(0x52)

这应该是赋值了吧,当A的值等于0的时候,就给countNum赋值了,不知道怎么避免。

使用特权

评论回复
5
ayb_ice| | 2012-5-10 09:10 | 只看该作者
2# ejack  


C:0x09E7    2465     ADD      A,#countNum(0x65)
C:0x09E9    F8       MOV      R0,A
C:0x09EA    A652     MOV      @R0,vaNumB(0x52)

这应该是赋值了吧,当A的值等于0的时候,就给countNum赋值 ...
angler001 发表于 2012-5-10 09:05
这里和countNum没有关系,只是KEIL借用了他的地址常量而已

使用特权

评论回复
6
ejack| | 2012-5-11 07:52 | 只看该作者
2# ejack  


C:0x09E7    2465     ADD      A,#countNum(0x65)
C:0x09E9    F8       MOV      R0,A
C:0x09EA    A652     MOV      @R0,vaNumB(0x52)

这应该是赋值了吧,当A的值等于0的时候,就给countNum赋值 ...
angler001 发表于 2012-5-10 09:05


好好看书……
首先ADD指令不会改写第2个操作数,
其次立即数,跟变量没有一分钱的关系。

变量被意外改写,查其它地方。

使用特权

评论回复
7
liang7143| | 2012-5-11 09:52 | 只看该作者
LZ 应该跟踪下calculationGroupFlag 的值
会不会操作pwmValueTemp数组 越界了

使用特权

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

本版积分规则

0

主题

34

帖子

1

粉丝