C 内联程序集:错误的寄存器名
编译此文件时,我收到“错误:错误的寄存器名''%ecx'”C 内联程序集:错误的寄存器名,c,gcc,inline-assembly,C,Gcc,Inline Assembly,编译此文件时,我收到“错误:错误的寄存器名''%ecx'” #include <stdio.h> int main(void){ asm("mov 3, %%ecx\n\t"); // ... return 0; } #包括 内部主(空){ asm(“mov 3,%%ecx\n\t”); // ... 返回0; } 当您想要使用gcc的“扩展内联汇编”以及输入、输出和缓冲列表时,使用寄存器的双百分比符号。这是因为内联汇编程序根据这些列表和%后面的数字保留了
#include <stdio.h>
int main(void){
asm("mov 3, %%ecx\n\t");
// ...
return 0;
}
#包括
内部主(空){
asm(“mov 3,%%ecx\n\t”);
// ...
返回0;
}
当您想要使用gcc的“扩展内联汇编”以及输入、输出和缓冲列表时,使用寄存器的双百分比符号。这是因为内联汇编程序根据这些列表和%
后面的数字保留了一个百分号来替换实际操作数名称
如果不想使用“扩展”内联程序集,只需使用普通的AT&t语法即可。这样做:
int main(void)
{
asm("mov 3, %ecx\n\t");
return 0;
}
与gcc 4.6.3完美配合。我还假设您知道
mov3、%ecx
和mov3、%ecx
当您想要使用gcc的“扩展内联汇编”以及输入、输出和缓冲列表时,会使用寄存器的双百分比符号。这是因为内联汇编程序根据这些列表和%
后面的数字保留了一个百分号来替换实际操作数名称
如果不想使用“扩展”内联程序集,只需使用普通的AT&t语法即可。这样做:
int main(void)
{
asm("mov 3, %ecx\n\t");
return 0;
}
与gcc 4.6.3完美配合。我还假设您知道
mov3、%ecx
和mov3、%ecx
之间的区别,为什么要使用百分之二的符号?还有,\n\t
的任何原因?这不是printf格式;不需要这些。什么编译器?内联汇编程序语法依赖于编译器。@mat@Jongware我在windows 64位上使用gcc@キューゾリファイ 你完全错了(大概是%),你试着看的时间比你争辩的时间要少!关于\n\t
,如果没有多条指令,这是一种无害无益的情况。为什么要使用百分之二的符号?还有,\n\t
的任何原因?这不是printf格式;不需要这些。什么编译器?内联汇编程序语法依赖于编译器。@mat@Jongware我在windows 64位上使用gcc@キューゾリファイ 你完全错了(大概是%),你试着看的时间比你争辩的时间要少!关于\n\t
当您没有多条指令时,这是一种无害无帮助的情况;int-dst=0;asm(“mov$0x03,%ecx\n\trpt:\n\t\tnop\n\tloop rpt”:“=r”(dst):“r”(src))现在我得到了在%-字母之后缺少操作数的@キューゾリファイ 当使用扩展格式asm()
(且仅使用扩展格式)时,必须在寄存器上使用%%
,在操作数上仅使用一个%%
。阅读你之前评论的链接!谢谢对不起,我昨天晚上才开始做这个。事实上,我想创建一个循环intsrc=1;int-dst=0;asm(“mov$0x03,%ecx\n\trpt:\n\t\tnop\n\tloop rpt”:“=r”(dst):“r”(src))
现在我得到了在%-字母之后缺少操作数的@キューゾリファイ 当使用扩展格式asm()
(且仅使用扩展格式)时,必须在寄存器上使用%%
,在操作数上仅使用一个%%
。阅读你之前评论的链接!谢谢对不起,我昨天晚上才开始。