OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5961|回复: 10

MDK编译器BUG求证!!!

[复制链接]

1

主题

8

帖子

0

精华

新手入门

积分
11
金钱
11
注册时间
2016-3-10
在线时间
3 小时
发表于 2016-3-10 08:15:16 | 显示全部楼层 |阅读模式
1金钱


写了个函数:
void test(s8 x,s8 y,s8 z)
{
  u32 data,datb,datc,datm,datn;
  u32 *scp;
  u8 i,a,b,c,n,k,s,t;

  if(z<50)
  {
    scp=datbuf;    //数组名datbuf
    a=x<<1;
    a--;
    b=z<<1;
    b++;
    scp+=a;
    data=*scp++;
    datb=*scp++;
   ....
  }
}

1.问题点:
   编译后打开汇编发现 data=*scp++编译错误,运行数据完全不对头。
2.多次重新排列语句顺序会有不同的错误出现,如datb=*scp++该语句编译错误
3.如果把data=*scp++拆成两句 data=*scp;scp++;编译又正常了。

编译错误图片如附件,搞不懂这是怎么了,求大神指点。
[img]file:///C:\Documents and Settings\Administrator\Application Data\Tencent\Users\1661864269\QQ\WinTemp\RichOle\[56FX@Y95HKDBVTX19KN@1U.png[/img]

编译图片.png
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

70

主题

6758

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
12991
金钱
12991
注册时间
2012-11-26
在线时间
3789 小时
发表于 2016-3-10 08:48:53 | 显示全部楼层
好好学学指针吧,这种低级问题,keil还不至于犯
回复

使用道具 举报

6

主题

1097

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3571
金钱
3571
注册时间
2014-12-2
在线时间
365 小时
发表于 2016-3-10 09:10:16 | 显示全部楼层
话说刚开始学习那会儿,也总是认为keil编译器有问题,我的代码并没有达到想要的要求,
但等学会C语言并懂点儿汇编后,再一一跟踪代码发现,keil从C语言翻译到汇编并没有错误,是自己写的代码不是自己真实希望表达的意思。

楼主没有贴全部的代码,也没有贴完全的汇编指令结果,所以无法判断你代码哪里有问题。

但几乎可以肯定的是,你代码有问题。

如果方便的话,请贴一下全部的代码或这个函数整个的汇编结果,我们来帮你分析分析。
坚决不用寄存器,拒绝重复造轮子。
回复

使用道具 举报

1

主题

8

帖子

0

精华

新手入门

积分
11
金钱
11
注册时间
2016-3-10
在线时间
3 小时
 楼主| 发表于 2016-3-10 10:21:47 | 显示全部楼层
xkwy 发表于 2016-3-10 09:10
话说刚开始学习那会儿,也总是认为keil编译器有问题,我的代码并没有达到想要的要求,
但等学会C语言并懂 ...

谢谢你们的提点!
  我把函数简化了,并汇编一起剪图附上。说明:Middatbuf是个二维数组。
编译图片2.png
回复

使用道具 举报

1

主题

8

帖子

0

精华

新手入门

积分
11
金钱
11
注册时间
2016-3-10
在线时间
3 小时
 楼主| 发表于 2016-3-10 10:29:49 | 显示全部楼层
幼儿园学长 发表于 2016-3-10 10:21
谢谢你们的提点!
  我把函数简化了,并汇编一起剪图附上。说明:Middatbuf是个二维数组。

补充一下:把二维数组换成一维数组后的编译结果也是一样。
回复

使用道具 举报

6

主题

1097

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3571
金钱
3571
注册时间
2014-12-2
在线时间
365 小时
发表于 2016-3-10 13:39:31 | 显示全部楼层
[mw_shl_code=asm,true]PUSH          {r4-r6,lr}[/mw_shl_code]
压栈
[mw_shl_code=asm,true]MOV           r3,r0
MOV           r4,r1
MOV           r5,r2[/mw_shl_code]
将传来的参数读取出来,以便可以使用r0-r2

[mw_shl_code=asm,true]LDR           r0,[pc,#12]  ; @0x08000350[/mw_shl_code]
将数组赋值给r0,此后r0便指向该数组。

[mw_shl_code=asm,true]LDM           r0!,{r1}
LDM           r0!,{r2}[/mw_shl_code]
将数组内容放到r1,r2,即r1 = Middatbuf[2][0];r2 = Middatbuf[2][1];

[mw_shl_code=asm,true]CMP           r1,r2
BLS           0x0800034C[/mw_shl_code]
比较r1和r2,即若Middatbuf[2][0]<=Middatbuf[2][1],则函数返回


[mw_shl_code=asm,true]
MOVS          r1,#0x00[/mw_shl_code]

(Middatbuf[2][0]>Middatbuf[2][1])将r1清零(即data = 0)


-------


所以,你的问题是什么?

坚决不用寄存器,拒绝重复造轮子。
回复

使用道具 举报

1

主题

8

帖子

0

精华

新手入门

积分
11
金钱
11
注册时间
2016-3-10
在线时间
3 小时
 楼主| 发表于 2016-3-10 14:38:10 | 显示全部楼层
xkwy 发表于 2016-3-10 13:39
压栈
将传来的参数读取出来,以便可以使用r0-r2

现在的问题:data=*scp++;和datb=*scp++这两句运行的结果是不对的
回复

使用道具 举报

1

主题

8

帖子

0

精华

新手入门

积分
11
金钱
11
注册时间
2016-3-10
在线时间
3 小时
 楼主| 发表于 2016-3-10 14:44:00 | 显示全部楼层
幼儿园学长 发表于 2016-3-10 14:38
现在的问题:data=*scp++;和datb=*scp++这两句运行的结果是不对的

补充说明:
把这两句改成 data=*scp;scp++;datb=*scp;scp++后编译才正常。汇编结果如附图。
编译图片3.png
回复

使用道具 举报

1

主题

8

帖子

0

精华

新手入门

积分
11
金钱
11
注册时间
2016-3-10
在线时间
3 小时
 楼主| 发表于 2016-3-10 14:53:18 | 显示全部楼层
xkwy 发表于 2016-3-10 13:39
压栈
将传来的参数读取出来,以便可以使用r0-r2

按照你的描述,那么编译是正确的,实际上运行结果data/datb赋值的内容错误,把赋值和地址加1分开编译后运行结果才正确。
回复

使用道具 举报

1

主题

8

帖子

0

精华

新手入门

积分
11
金钱
11
注册时间
2016-3-10
在线时间
3 小时
 楼主| 发表于 2016-3-10 15:21:59 | 显示全部楼层
幼儿园学长 发表于 2016-3-10 14:53
按照你的描述,那么编译是正确的,实际上运行结果data/datb赋值的内容错误,把赋值和地址加1分开编译后运 ...

根据指令说明,该处应该是LDMIA.W RD! {寄存器列表} 每读取 Rd一次,地址递增一次。字宽 32bit.
编译图片4.png
回复

使用道具 举报

1

主题

8

帖子

0

精华

新手入门

积分
11
金钱
11
注册时间
2016-3-10
在线时间
3 小时
 楼主| 发表于 2016-3-11 09:25:25 | 显示全部楼层
幼儿园学长 发表于 2016-3-10 15:21
根据指令说明,该处应该是LDMIA.W RD! {寄存器列表} 每读取 Rd一次,地址递增一次。字宽 32bit.

顶上,请大神们不吝指点!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-2-26 09:55

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表