使用寄存器而不保留它们? (组装)

时间:2016-02-09 18:05:24

标签: windows assembly x86-64 cpu-registers win64

在Windows调用会话之后,只能使用RAX,RCX,RDX,r8和r9而不必保留它们(称为volatile),其余的称为非易失性(必须保留)。

使用非挥发性寄存器而不保留它们是否有问题? (我经常这样做,到目前为止我还没有遇到任何问题)

调用约定说只有RCX,RDX,r8和r9用于传递整数参数,而额外的参数应该在堆栈上传递。

使用r10作为第五个参数而不是堆栈有什么缺点吗? (知道内存至少比寄存器慢100倍,我试着充分利用寄存器)

当有十几个额外的寄存器时,为什么调用约定会在4个寄存器中停止传递参数?

2 个答案:

答案 0 :(得分:1)

大声写出来作为答案,因为我相信@Michael Petch(和其他人)指出需要强调,以供将来参考,而不仅仅是评论。

违反ABI这是不错的做法,这是完全错误的
像引用悬空指针,写入常量内存等等那样的错误。

背后的推理非常明显:调用者通常在非易失性寄存器中有临时数据,它可以是字符串索引,总和,加密哈希等等。

如果您控制ABI,则制定规则;如果你没有,你就不会。

答案 1 :(得分:0)

您“需要”保留非易失性寄存器,以便函数的调用者可以依赖它来保持这些寄存器中的值不变。

另外,试想一下,如果你编写一个使用这些寄存器作为参数而不是堆栈的函数,调用者必须在哪里存储他的值? 堆栈,在某些时候无法绕过它。

您确实可以将非易失性寄存器推送到堆栈,然后在需要时将其弹回。