【问题标题】:What is the colon in the c language between two strings?c语言中两个字符串之间的冒号是什么?
【发布时间】:2013-11-17 11:03:44
【问题描述】:

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

如果有帮助,现在编译器会说:invalid 'asm': invalid expression as operand。仍在与这个战斗...... :)

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

【问题讨论】:

  • “编译器”:你在使用 gcc 吗? (这就是编写这些示例的目的。几乎每个编译器都有自己的内联汇编版本。)
  • @Jongware:确实,这个问题根本与 C 语言无关。
  • 我正在使用gcc 4.7.3
  • @JohnZwinck 随时重新标记问题。我承认不知道应该如何标记它。

标签: gcc assembly inline-assembly


【解决方案1】:

这是来自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 说 使用任何寄存器来存储操作数。输出操作数 约束应该有一个约束修饰符“=”。还有这个修饰符 表示它是输出操作数并且是只写的。
  • 有两个 % 以寄存器名称为前缀。这有助于 GCC 区分 操作数和寄存器之间。操作数只有一个 % as 字首。
  • 第三个冒号后被破坏的寄存器 %eax 告诉 GCC %eax 的值要在 "asm" 中修改,所以 GCC 不会 使用此寄存器存储任何其他值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多