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

时间:2013-11-17 11:03:45

标签: gcc assembly inline-assembly

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

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

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

1 个答案:

答案 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不会   使用此寄存器存储任何其他值。
  •