搜索
bottom↓
回复: 7

混合编程中怎么通过汇编访问C程序中定义的const 数组元素???

[复制链接]

出0入0汤圆

发表于 2014-6-11 14:51:05 | 显示全部楼层 |阅读模式
废话不多说,直接贴程序:

大概的讲一下程序的功能和结构,首先定义了两个const类型的数组,然后每个一段时间从这个数组中取出一个值赋给PORTC和PORTD,PORTC和PORTD上分别连接了8个LED灯。这样LED灯就会呈现出各种定义好的亮法。用的硬件是atmega128,编译器是avrstudio+winavr。问一下大家,这个const修饰的两个数组存储在哪里?估计很多人和我一样认为这两个数组存储在单片机的程序存储区即flash中,但实施情况是否如此呢?我们来看一下汇编代码:

分析程序可知,R18是作为i来计数的
MOV       R30,R18        ;i的值赋值到R30中
LDI       R31,0x00       ;R31的值为0,也就是说Z的值为i
MOVW      R26,R30         ;将Z的值复制到X中
SUBI      R26,0x00        ;X-0xff00,0xff00最高位为1,所以为负数,二进制补码为0x0100,等价于X=X+0x0100
SBCI      R27,0xFF
LD        R24,X        ;将X地址处的值加载到R24中
OUT       0x15,R24        ;将R24的值赋给PORTC
所以,经过上面的代码分析可以得出结论,我们定义的const修饰的数组Pattern_P0存储在地址为0x0100地址的RAM中。为了验证我们的结论,我们来看一下RAM中的数据:

对比Pattern_P0中定义的值,可以很清楚的看到我们的结论是正确的。
对于这样的结论我觉得很奇怪,为什么定义的常数会存在RAM中呢???网上搜寻看到有文章说要使用#include  <avr\pgmspace.h>,然后用prog_uchar来定义,随后我将程序代码修改为:

编译之后看汇编,貌似没有什么变化,于是继续修改:

编译之后看汇编:

可以很明显的看到了LPM指令,也就是说,从程序存储器中读取数据了,
MOV       R24,R18        ;将i的值复制到R24中
LDI       R25,0x00              ;将R25的值设置为0,也就是说R25:R24存储了i
MOVW      R30,R24       ;将R25:R24的值复制到Z中
SUBI      R30,0x74             
SBCI      R31,0xFF              ;Z = Z - 0xFF74 等同于Z = Z + 0x8C也就是说Z = 0x8C + i
LPM       R30,Z                  ;从程序存储器中加载数据到R30
OUT       0x15,R30      ;PORTC = R30
从上面的分析可以得出结论,我们定义的const修饰的数组Pattern_P0存储在地址为0x8C地址的FLASH中。为了验证我们的结论,我们来看一下FLASH中的数据,有一点需要注意的是,由于LPM指令需要的地址为8bit字节地址,而程序存储器的地址为16bit word地址,所以我们的数据应该存储在0x8C/2(0x46)的程序存储器地址处:

现在我想将程序修改成:

然后

在汇编文件中实现上面所述的功能。现在就遇到一个问题,我如何才能在汇编中访问这个在C程序中定义的const 变量Pattern_P0呢?
望高手指点啊~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
小弟不胜感激~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

阿莫论坛20周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入0汤圆

发表于 2014-6-11 15:02:05 | 显示全部楼层
写的不错啊!!!!!

出0入42汤圆

发表于 2014-6-11 15:03:25 | 显示全部楼层
用import伪指令行不行?
ARM里面是可以用的

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

 楼主| 发表于 2014-6-11 15:07:55 | 显示全部楼层
zhoukun 发表于 2014-6-11 15:02
写的不错啊!!!!!

呵呵,菜鸟一个,希望得到大侠的指点~~~~~~~~~

出0入0汤圆

 楼主| 发表于 2014-6-11 15:10:39 | 显示全部楼层
wshtyr 发表于 2014-6-11 15:03
用import伪指令行不行?
ARM里面是可以用的

貌似不行,在winavr中使用.global(相当于EXPORT)和.extern(相当于IMPORT)伪指令

出0入0汤圆

 楼主| 发表于 2014-6-11 16:41:54 | 显示全部楼层
再贴一个纯汇编版本的,汇编器avrstudio:

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2014-8-3 22:47:19 | 显示全部楼层
很好的一个问题  可惜我不了解 AVR 汇编 但我觉得楼主这种精神值得我学习 留个印记

出35入0汤圆

发表于 2015-6-24 10:35:26 | 显示全部楼层
赞一个,真是万能的坛子,什么都能找到啊~
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-8-25 23:21

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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