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