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