ZHCADC4A September 2011 – March 2014
当调用者保存寄存器在调用期间处于活动状态,但被调用者不修改该寄存器时,编译器可以省略调用前后的保存和恢复,从而优化调用者函数代码。当出现该定义或调用辅助函数如节 8.3中所述具有特殊约定时,就会出现这种情况。
但是,寄存器 B30 和 B31 被指定为可能被任何跨越段边界的调用修改,即使出现了该定义或在调用辅助函数时也是如此。这样一来,如果调用需要 far 调用蹦床函数(节 5.3),则 B30 和 B31 可用作蹦床函数中的暂存寄存器。
此外,Linux 的延迟绑定机制要求调用者保存寄存器可供实现惰性绑定的存根函数使用。当被调用者可能被导入并因此可能通过延迟绑定调用时,编译器不得优化调用点。
同一段内的调用绝不需要蹦床函数;对于此类段内调用,B30 和 B31 的处理方式与其他调用者保存寄存器没有区别。