我正在尝试编辑IDT(中断描述符表),我找到了this code,这可以让我访问该结构。但我不明白asm
行中的冒号是什么。我想这是一些在C中使用位图的游戏,这是以某种方式填充指令。但我找不到任何确定的东西。
如果有帮助,那么编译器现在说:invalid 'asm': invalid expression as operand
。还在打这个......:)
那么,冒号在那里做什么?
答案 0 :(得分:7)
这是gcc
编译器的扩展asm语法。这是描述语法的link:
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区分 操作数和寄存器之间。操作数只有一个% 字首。
- 第三个冒号告诉海湾合作委员会后,被破坏的登记册%eax %eax的值将在“asm”内修改,因此GCC不会 使用此寄存器存储任何其他值。