OpenEdv-开源电子网

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

C和汇编混合编程,循环自减结果不对,请各位帮看一下哪里有问题(老师安排的实验题目)

[复制链接]

0

主题

2

帖子

0

精华

新手上路

积分
37
金钱
37
注册时间
2019-12-24
在线时间
9 小时
发表于 2020-7-3 21:31:28 | 显示全部楼层 |阅读模式
1金钱
本帖最后由 mey 于 2020-7-4 08:30 编辑

题目:将a,b两数组对应相加,值放在c数组中,并通过串口打印出来
代码:
  1. void fun1(const int* aa,const int* ab,int* ac,int* ae,int ad)
  2. {
  3.                         int ch1;
  4.                         int ch2;
  5.                         int ch3;
  6.                         int ch4;
  7.       __asm
  8.       {
  9.                                                 
  10.                                          MOV                ch4, #8
  11.       loop:
  12.                                          LDR                ch1, [aa], #1
  13.                                          LDR                ch2, [ab], #1
  14.                                          ADD                ch3,ch2,ch1
  15.                                          STR                ch3, [ac], #1
  16.                                          SUB                ch4, #1
  17.                                          STR                ch4, [ae],#1
  18.                                          CMP                ch4, #0
  19.                                          BNE                 loop
  20.                                        
  21.       }
  22. }
复制代码
运行结果如下(d是循环自增后的值):
数组c的元素依次为:3
6
9
0
0
0
0
0
数组d的元素依次为:67438087
66051
-1
0
0
0
0
0

最佳答案

查看完整内容[请看2#楼]

调试发现是地址偏移错了,正确代码如下(__asm{}里面的部分): 本来开始不确定地址偏移对不对,但是发现c数组前三个都是对的就觉得地址偏移没有错,导致后来的时候一直在纠结循环次数,可以忽略了地址偏移的问题。某一次调试的时候仔细看寄存器和内存的值才突然发现是地址偏移的问题。(此次的经验告诉我们永远不要预判你的程序哪里有问题,哪里没问题,出了问题就要仔仔细细全检查一遍)
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

0

主题

2

帖子

0

精华

新手上路

积分
37
金钱
37
注册时间
2019-12-24
在线时间
9 小时
 楼主| 发表于 2020-7-3 21:31:29 | 显示全部楼层
本帖最后由 mey 于 2020-7-8 17:08 编辑

调试发现是地址偏移错了,正确代码如下(__asm{}里面的部分):
  1.                  MOV      ch4, ad
  2.       loop:        
  3.                  LDR        ch1, [aa], #4
  4.                  LDR        ch2, [ab], #4
  5.                  ADD        ch3,ch2,ch1
  6.                  STR         ch3, [ac], #4
  7.                  SUB         ch4, ch4, #1
  8.                  CMP         ch4, #0
  9.                  BNE         loop
复制代码


本来开始不确定地址偏移对不对,但是发现c数组前三个都是对的就觉得地址偏移没有错,导致后来的时候一直在纠结循环次数,可以忽略了地址偏移的问题。某一次调试的时候仔细看寄存器和内存的值才突然发现是地址偏移的问题。(此次的经验告诉我们永远不要预判你的程序哪里有问题,哪里没问题,出了问题就要仔仔细细全检查一遍)
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-18 09:11

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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