GCC编译时有关关键字volatile的问题

lishangzcq 2015-01-23 05:46:13
源代码如下(example1.c):

int main(int __argc,char *__argv[]){
int cr0=5;
__asm____volatile__("movl %%cr0,%0":"=a"(cr0));
return 0;
}


用$ gcc -S example1.c指令编译时出错,

错误信息:error:expected ')' before ':' token
__asm____volatile__("movl %%cr0,%0":"=a"(cr0));

然后把__volatile__去掉后,这段代码就可以编译成功生成汇编代码

我知道volatile的功能是向GCC声明“不要动我所写的InstructionList,我需要原封不动的保留每一条指令”

所以我不明白为什么这段程序无法编译通过,还请高手解惑?

win7系统,虚拟机GCC版本是“GCC:(Ubuntu 4.8.2-19ubuntu1) 4.8.2”

...全文
283 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
Yick__ 2015-01-24
  • 打赏
  • 举报
回复
引用 4 楼 lishangzcq 的回复:
[quote=引用 3 楼 zhxianbin 的回复:] __asm__ __volatile__ 这直接应该是有空格的
正解,在__asm__和__volatile__之间要有空格, 最近刚学linux,网上的资料格式太差了,这种格式错误还真没看出来[/quote]是的,别说我还没看出来
lishangzcq 2015-01-24
  • 打赏
  • 举报
回复
引用 1 楼 zhxianbin 的回复:
"movl %%cr0,%0":"=a"(cr0) 这个好像不对吧 http://www.cppblog.com/jb8164/archive/2008/02/26/43260.html
请问哪里不对呢,看了资料不是很懂,如果是cr0前面的%号的话,删除一个依然不行,而后面的输出、输入、破坏模板部分都是可省略的,而这句代码省略的是后两部分,所以冒号应该也是可以省略的,还望指教
lishangzcq 2015-01-24
  • 打赏
  • 举报
回复
引用 3 楼 zhxianbin 的回复:
__asm__ __volatile__ 这直接应该是有空格的
正解,在__asm__和__volatile__之间要有空格, 最近刚学linux,网上的资料格式太差了,这种格式错误还真没看出来
zhxianbin 2015-01-24
  • 打赏
  • 举报
回复
__asm__ __volatile__ 这直接应该是有空格的
zhxianbin 2015-01-23
  • 打赏
  • 举报
回复
"movl %%cr0,%0":"=a"(cr0) 这个好像不对吧 http://www.cppblog.com/jb8164/archive/2008/02/26/43260.html

4,441

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 内核源代码研究区
社区管理员
  • 内核源代码研究区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧