V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
doraos
V2EX  ›  问与答

x86 调用者保存被调用者保存寄存器数量是否分配的不太合理

  •  
  •   doraos · 2019-01-30 14:42:33 +08:00 · 1870 次点击
    这是一个创建于 2122 天前的主题,其中的信息可能已经有所发展或是发生改变。

    刚看 CASPP,上面说 X86_64 _中被调用者保存%rbp %rbx, %r12~%r15 而剩下来的由调用者保存,被调用者保存那么少,调用者函数保存那么多,是否分配的有点不合理,应该更多的由被调用者来保存所需的寄存器吧.mips 就是这样的

    4 条回复    2019-01-30 15:59:00 +08:00
    misaka19000
        1
    misaka19000  
       2019-01-30 15:14:43 +08:00 via Android   ❤️ 1
    这个不是应该由编译器分配的吗,似乎和 CPU 本身没什么关系?
    GeruzoniAnsasu
        2
    GeruzoniAnsasu  
       2019-01-30 15:32:05 +08:00   ❤️ 1
    首先 x86 跟 x86_64 不一样。。。x86_64 一般简写成 x64

    然后 bp bx r12 r13 r14 r15
    vs
    ax cx dx di si sp r8 r9 r10 r11
    。。是咋得出被调用者保存少的结论的
    feather12315
        3
    feather12315  
       2019-01-30 15:35:41 +08:00 via Android   ❤️ 1
    @GeruzoniAnsasu #2,correct:x64 —> AMD64 / Intel 64 / x86_64。我的记忆中,并不会简写为 x64。
    GeruzoniAnsasu
        4
    GeruzoniAnsasu  
       2019-01-30 15:59:00 +08:00   ❤️ 1
    @feather12315 行 8,就当做 x86 扩展到 64 位的各种架构不统一必须叫自己的名字好了

    想补充吐槽一下“保存”这个词
    我猜原文说的是 preserve?
    在 intel 的手册 38.3.2

    > As with most systems, it is the responsibility of the callee to preserve all registers except that used for returning a
    value.

    应该译作“保护”,我 2#的意思说反了,lz 说的东西的原意应该是

    “被调函数有义务保证 rbp rbx r12~r15 这几个寄存器的值在进出函数前后一致”

    如果按照 lz 的疑问是“为什么被调 routine 可以随意修改这么多寄存器的值不需要负责任”来理解的话

    ……只能回复说,恩,官方其实是建议负责任的,但可能现行 ABI 制定者觉得没必要
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1118 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 18:41 · PVG 02:41 · LAX 10:41 · JFK 13:41
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.