6

在使用类 C 语言将内联汇编器插入函数时,关于允许将哪些寄存器用于临时的约定是什么?asm在进入块之前保存它需要保存的所有寄存器的值是编译器的责任吗?程序员是否有责任将这些寄存器中的值存储在某个地方并在退出asm块之前恢复它们?是否有一个典型的约定,或者这是非常特定于实现的?

4

3 回答 3

9

根据定义,内联汇编是特定于编译器的。

大多数支持内联汇编的编译器都有一种语法,允许您指示汇编修改了哪些寄存器。然后编译器可以根据需要保存和恢复这些寄存器。

于 2009-10-24T05:21:58.477 回答
7

这是非常特定于编译器的。然而,作为一个实际的例子,让我们以 x86 上的 gcc 为例。格式为:

asm ( assembler template
    : output operands               (optional)
    : input operands                (optional)
    : list of clobbered registers       (optional)
    );  

“被破坏的寄存器列表”是你告诉编译器你的代码正在使用哪个寄存器。

这是一个简单的内存复制代码:

asm ("movl $count, %%ecx;
      up: lodsl;    
      stosl;
      loop up;"
    :           /* no output */
    :"S"(src), "D"(dst) /* input */
    :"%ecx", "%eax" );  /* clobbered list */    

鉴于这些方向,gcc 不会将 eax 和 ecx 用于块中的其他内容。

更多信息在这里

于 2009-10-24T05:52:19.943 回答
2

您可以在此处阅读某些调用约定中的寄存器用法。

于 2009-10-24T05:37:15.163 回答