You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在x64 Linux汇编中常规使用r10、r11寄存器的可行性

关于在x64汇编中使用r10/r11作为临时变量的兼容性问题

首先可以明确告诉你:完全不会有兼容性问题,这正是这两个寄存器在Linux平台默认遵循的System V AMD64调用约定里的设计用途!

让我给你拆解一下背后的逻辑:

  • 在Linux x64的调用约定中,寄存器被分为两类:callee-saved(被调用者保存)和caller-saved(调用者保存)。r10和r11属于后者,也就是被调用的函数可以随意修改它们的值,不需要在函数入口保存、出口恢复。
  • 当你的C/C代码调用你的汇编函数时,编译器已经明确知道这两个寄存器是易失性的——如果调用前C/C代码里有用到r10/r11的内容,编译器会自动把这些值先保存到栈上,调用结束后再恢复。你的汇编函数完全不用操心这一点。

不过有个小细节需要注意:

  • 如果你的汇编函数内部还要调用其他遵循System V约定的函数,那你要记住:被调用的那个函数也有权随意修改r10/r11。也就是说,如果你在调用其他函数之前用r10/r11存了临时值,调用之后这些值就会被覆盖。如果之后还需要用这些值,你得自己把它们暂存到栈上(哪怕你不创建栈帧,只要直接用栈空间就行,注意Linux x64要求栈在调用函数时保持16字节对齐)。

另外,既然你这么关注效率,用r10/r11做临时变量是非常明智的选择——寄存器访问的速度远快于栈内存,完全符合你“每一个周期都至关重要”的需求。

内容的提问来源于stack exchange,提问作者Elian Kamal

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 07:09:05