在 C/C++ 中编写使用内联汇编 (x86-64) 的函数时,在需要时选择任何 GPR(rax 到 r15)是否安全?

when writing a function in C/C++ that uses inline assembly (x86-64), is it safe to choose any GPRs (rax to r15) when want to?

我不熟悉在 C/C++ 中编写包含内联汇编的函数的概念,我想知道使用所有可用的通用寄存器是否安全。 (从 rax 到 r15)

据我所知,所有的variables/objects/data实际上都存储在主存中,只有在我们对它进行操作时才加载到寄存器中,因此我假设它实际上是可以安全地将任何 GP 寄存器与函数内的内联汇编一起使用,但我不确定。

我担心是否有可能出现某些寄存器仍在函数外部使用的情况,并且当调用该函数时这些寄存器的值可能会被覆盖并可能在程序中产生一些错误?

在编写内联汇编时有什么寄存器是我应该避免的吗?

不,“数据实际上存储在主内存中,并且仅在我们对其执行操作时才加载到寄存器中”的说法是不正确的。编译器非常努力地将数据保存在寄存器中,并且只在需要时才溢出到内存。

你必须告诉编译器你在内联汇编中使用的所有寄存器,这样它才能确保它们对你可用。 None 个寄存器可供免费使用。

为了向编译器表明您正在修改寄存器的内容,您将它们列为输出或在 clobber 列表中。