Gcc 在c语言中,两个字符串之间的冒号是什么?
我正在尝试编辑IDT(中断描述符表),我已经找到了可以访问该结构的文件。但是我不明白asm行中的冒号是什么。我猜这是一个用C语言制作位图的游戏,这是在某种程度上填充指令。但我找不到任何确定的东西 如果有帮助,编译器现在会说:Gcc 在c语言中,两个字符串之间的冒号是什么?,gcc,assembly,inline-assembly,Gcc,Assembly,Inline Assembly,我正在尝试编辑IDT(中断描述符表),我已经找到了可以访问该结构的文件。但是我不明白asm行中的冒号是什么。我猜这是一个用C语言制作位图的游戏,这是在某种程度上填充指令。但我找不到任何确定的东西 如果有帮助,编译器现在会说:无效的“asm”:作为操作数的表达式无效。还在和这个战斗…:) 那么,冒号在那里做什么呢?这是来自gcc编译器的扩展asm语法。下面是一个描述语法的示例: asm ( assembler template : output operands
无效的“asm”:作为操作数的表达式无效
。还在和这个战斗…:)
那么,冒号在那里做什么呢?这是来自
gcc
编译器的扩展asm语法。下面是一个描述语法的示例:
asm ( assembler template
: output operands /* optional */
: input operands /* optional */
: list of clobbered registers /* optional */
);
举个例子:
int a=10, b;
asm ("movl %1, %%eax;
movl %%eax, %0;"
:"=r"(b) /* output */
:"r"(a) /* input */
:"%eax" /* clobbered register */
);
- “b”是输出操作数,由%0引用,“a”是输入 操作数,由%1引用
- “r”是对操作数的约束。我们会 请参见后面的约束详细信息。目前,“r”对GCC说 使用任何寄存器存储操作数。输出操作数 约束应具有约束修饰符“=”。这个修饰语呢 表示它是输出操作数且仅为写操作数
- 有两个 %的前缀加在寄存器名称的前面。这有助于GCC区分 在操作数和寄存器之间。操作数有一个%as 前缀李>
- 在第三个冒号之后被删除的寄存器%eax告诉GCC %eax的值将在“asm”内修改,因此GCC不会 使用此寄存器存储任何其他值
“编译器”:你在使用gcc吗?(这就是编写这些示例的目的。几乎每个编译器都有自己的内联汇编版本。)@Jongware:事实上,这个问题根本不是关于C语言的。我使用的是
GCC4.7.3
@JohnZwinck请随意重新标记这个问题。我承认我不知道应该如何标记它。