Ram*_*hil 2 assembly gcc inline-assembly
我正在尝试编辑IDT(中断描述符表),我发现这个代码可以让我访问该结构.但是我不明白这asm条线上的冒号是什么.我想这是一些在C中使用位图的游戏,这是以某种方式填充指令.但我找不到任何确定的东西.
如果它有帮助,那么编译器现在说:invalid 'asm': invalid expression as operand.还在打这个... :)
那么,冒号在那里做什么?
这是gcc编译器的扩展asm语法.这是一个描述语法的链接:
asm ( assembler template
: output operands /* optional */
: input operands /* optional */
: list of clobbered registers /* optional */
);
Run Code Online (Sandbox Code Playgroud)
和例子:
int a=10, b;
asm ("movl %1, %%eax;
movl %%eax, %0;"
:"=r"(b) /* output */
:"r"(a) /* input */
:"%eax" /* clobbered register */
);
Run Code Online (Sandbox Code Playgroud)
- "b"是输出操作数,由%0引用,"a"是输入操作数,由%1引用.
- "r"是对操作数的约束.我们稍后会详细介绍约束.目前,"r"向GCC表示使用任何寄存器来存储操作数.输出操作数约束应该有一个约束修饰符"=".而这个修饰符表示它是输出操作数并且是只写的.
- 寄存器名称前面有两个%的前缀.这有助于GCC区分操作数和寄存器.操作数具有单个%作为前缀.
- 第三个冒号后的修改后的寄存器%eax告诉GCC%eax的值将在"asm"内修改,因此GCC不会使用该寄存器来存储任何其他值.