如何在嵌入的汇编中使用C定义的全局变量

[复制链接]
yewuyi 发表于 2009-12-31 08:55 | 显示全部楼层
呵呵,按照11楼的要求,俺就贴一个MPLAB+PICC9.50PL2下的编译实例。说明:在PICC下面,这种方式只支持全局变量,当想在C代码行中嵌入汇编代码并想引用这个变量时,直接在变量名前加下划线即可(不加则会编译报错),如果是局部变量,嵌入汇编时直接引用变量名或者是在变量名前加下划线的方式都是不可以的,局部变量的情况下,我所知道的PICC只能去看反汇编代码中这个变量被编译后生成的名字,再把这个名字拷贝出来在嵌入汇编中使用。

本帖子中包含更多资源

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

×
yewuyi 发表于 2009-12-31 08:55 | 显示全部楼层
个人愚见:PICC下的这个方式应该是大多数C编译器通认的方式。
HWM 发表于 2009-12-31 09:06 | 显示全部楼层
嵌入汇编通常是“非标”用法,对于这种非标准的东西建议“定制”——按具体编译试着做。非标产品别到标准中去找,找了也是徒劳,这是一个机械工程师的忠告。
desert_hawk 发表于 2009-12-31 10:09 | 显示全部楼层
应该跟map文件有关。map文件中该变量的地址条目标号如果带下划线,汇编中引用就得加,否则就不用加。
因特网用户 发表于 2009-12-31 12:32 | 显示全部楼层
冷漠提供一个使用内嵌汇编编译成功的工程文件吧
我用#pragma ,并且激活了SRC设置
编译还是有问题
用混合编程的方法倒是能够成功
yewuyi 发表于 2009-12-31 13:51 | 显示全部楼层
应该跟map文件有关。map文件中该变量的地址条目标号如果带下划线,汇编中引用就得加,否则就不用加。
desert_hawk 发表于 2009-12-31 10:09



老板,和MAP有什么关系?!太牵强了把?!
GHG80H 发表于 2009-12-31 14:32 | 显示全部楼层
长见识了,祝2010年....
冷漠 发表于 2009-12-31 18:04 | 显示全部楼层
回26楼。转换之后还有些工作,基本原则:缺什么,补什么。举例:

本帖子中包含更多资源

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

×
冷漠 发表于 2009-12-31 18:07 | 显示全部楼层
本帖最后由 冷漠 于 2009-12-31 18:12 编辑

void delayms(unsigned int ms)        // 延时函数。                        
{
        unsigned char i;
        while(ms--)
        {
                for(i = 0; i < 120; i++);
        }
}

本帖子中包含更多资源

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

×
desert_hawk 发表于 2009-12-31 20:27 | 显示全部楼层
个人愚见:PICC下的这个方式应该是大多数C编译器通认的方式。
yewuyi 发表于 2009-12-31 08:55

这个东西本身就跟编译器的设计有关系,没有什么应该不应该,最起码keil和IAR两大主流编译器都不是这么设计的。
desert_hawk 发表于 2009-12-31 21:04 | 显示全部楼层
老板,和MAP有什么关系?!太牵强了把?!
yewuyi 发表于 2009-12-31 13:51

没觉得有什么牵强的,在汇编中引用C文件中的变量,实际就是引用该变量的地址,而map文件的写法,在一定程度上反映了编译器如何识别变量地址。keil和IAR的map文件中变量地址标号都是不带下划线的,所以在汇编文件或是C文件中嵌入汇编时引用变量名也不用加下划线。ICCAVR的map文件的变量地址标号都是带下划线的,所以在汇编文件或C文件中嵌入汇编时引用变量名都需要加下划线,不加就识别不了。6楼说查看.lst文件看汇编中引用变量时是否加下划线,我用ICCAVR试了一下并不奏效,因为ICCAVR的lst文件中对变量名的引用没有下划线,而单独编写汇编文件或在C文件中嵌入汇编都需要加下划线。
我只是试着找出规律,也许并不是所有编译器都符合这个规律,但个人觉得并不牵强。
ruyeecheung 发表于 2010-1-1 19:15 | 显示全部楼层
实在不行的话,就看看对应的汇编语言,找出全局变量的地址,在嵌入汇编语言中用这个地址吧
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 在线客服 返回列表 返回顶部