两个字符串之间的c语言中的冒号是什么?

Ram*_*hil 2 assembly gcc inline-assembly

我正在尝试编辑IDT(中断描述符表),我发现这个代码可以让我访问该结构.但是我不明白这asm条线上的冒号是什么.我想这是一些在C中使用位图的游戏,这是以某种方式填充指令.但我找不到任何确定的东西.

如果它有帮助,那么编译器现在说:invalid 'asm': invalid expression as operand.还在打这个... :)

那么,冒号在那里做什么?

Nem*_*ric 8

这是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不会使用该寄存器来存储任何其他值.