繁体   English   中英

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

[英]Inline Assembler: What scratch registers can be used?

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

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

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

这是特定于编译器的。 但是,对于一个现实的例子,让我们在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用于块中的其他内容。

更多信息在这里

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM