内联汇编程序:可以使用哪些临时寄存器?

时间:2009-10-24 05:19:27

标签: c assembly conventions low-level inline-assembly

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

3 个答案:

答案 0 :(得分:9)

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

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

答案 1 :(得分: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用于其他内容。

更多信息here

答案 2 :(得分:2)

您可以在某些调用约定here中阅读注册用法。