打印
[AVR单片机]

gcc嵌入汇编语言的问题

[复制链接]
3858|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
wylinder|  楼主 | 2008-3-17 21:32 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我在编写一个软件,想一部分用GCC的C设计,一部分用汇编设计,我买了一本书,名为《AVR单片机GCC程序设计》,按照里边的例程也写了个.S的文件,并在C程序中进行调用,
#include <avr/io.h>

.section .text
.global    DATA_PUBLIC
DATA_PUBLIC:
cbi _SFR_IO_ADDR(PORTC),1
ldi R0,0
nop
ret


该程序更本编译不通过,只有把cbi _SFR_IO_ADDR(PORTC),1,ldi B,0,这两条语句都取消了编译才通过,请问原因在那里,是否有GCC嵌入式汇编编译成功的代码可以分享,谢谢!

相关帖子

沙发
John_Lee| | 2008-3-18 10:31 | 只看该作者

如果是做C调用的函数,不要单独写汇编文件

gcc的嵌入汇编功能很强大的。

func ()    // C函数
{
    ...;
    asm (
        这里嵌入汇编,具体参考gcc手册
    );
}

使用特权

评论回复
板凳
wylinder|  楼主 | 2008-3-19 15:53 | 只看该作者

GCC参考手册

首先谢谢John_Lee的回复!不知道你提到的这个GCC参考手册那里可以下载?是否告知一二?
我按照《AVR单片机GCC程序设计》里边描述嵌套的方法写了如下语句:
uchar tmp;
uchar *ptr1, *ptr2;
tmp = *ptr1;
1://__asm__ volatile("rol%0":"=r"(tmp):"0"(tmp));
2://asm volatile("rol%0":"=r"(tmp):"0"(tmp));
3://asm volatile("cli": :);
4: //asm volatile("swap%0":"=r"(tmp):"0"(tmp));
这几条语句只有3能够编译通过,产生最终可仿真文件,其它几条都不行,我不知道问题在那里,是我安装的WINAVR版本问题还是书写不对,弹出的报错信息也不能给予任何有价值的信息,请专家告知一二!
不胜感谢!

使用特权

评论回复
地板
John_Lee| | 2008-3-20 09:05 | 只看该作者

手册在WinAVR安装文件夹docgcchtmlgcc-?.?.?gcc

找Assembler Instructions with C Expression Operands这一章中有详细说明。

你的语句中少了“空格”(在%前面):asm volatile("rol %0":"=r"(tmp):"0"(tmp));

使用特权

评论回复
5
wylinder|  楼主 | 2008-3-20 18:15 | 只看该作者

谢谢指点

谢谢指点,我先搜一下你提到的整个**,谢谢!

使用特权

评论回复
6
qjy_dali| | 2008-3-22 18:54 | 只看该作者

要用内联汇编

GCC有相关文档。说个简单的例子,你到WinAVR的系统文件夹下,有很多头文件,其中有很多汇编实现的功能,比如sei(),cli()等等。

使用特权

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

本版积分规则

12

主题

29

帖子

0

粉丝