gpt4 book ai didi

assembly - x86汇编-为什么[e] bx保留在调用约定中?

转载 作者:行者123 更新时间:2023-12-04 16:34:20 25 4
gpt4 key购买 nike

我注意到许多调用约定都坚持为被调用方保留[e] bx。

现在,我可以理解为什么它们保留[e] sp或[e] bp之类的东西了,因为那样会弄乱被调用者的堆栈。我也可以理解为什么您可能想要保留[e] si或[e] di,因为如果不特别注意被调用者的字符串指令,它们可能会中断。

但是[e] bx?关于[e] bx,到底有什么重要的?是什么使[e] bx如此特别,以至于多个调用约定坚持要求在整个函数调用中都保留它?

与[e] bx混在一起会引起某种细微的错误/陷阱吗?

例如,修改[e] bx是否比修改[e] dx或[e] cx对被调用者有更大的影响?

我只是不明白为什么这么多调用约定会单独选择[e] bx进行保存。

最佳答案

并非所有寄存器都可以很好地保存:

no (e)ax -- Implicitly used in some instructions; Return value
no (e)dx -- edx:eax is implicity used in cdq, div, mul and in return values

(e)bx -- generic register, usable in 16-bit addressing modes (base)
(e)cx -- shift-counts, used in loop, rep

(e)si -- movs operations, usable in 16-bit addressing modes (index)
(e)di -- movs operations, usable in 16-bit addressing modes (index)

Must (e)bp -- frame pointer, usable in 16-bit addressing modes (base)
Must (e)sp -- stack pointer, not addressable in 8086 (other than push/pop)

从表中可以看出,有两个寄存器有充分的理由要保留,有两个寄存器有不充分的理由。累加器=(e)ax例如由于编码简短,它是最常使用的寄存器。 SI,DI组成一个逻辑寄存器对-在REP MOVS和其他字符串操作上,都被丢弃。

在一半的被叫方/主叫方保存范例中,只有在bx/cx比si/di优先的情况下,讨论基本上会进行。在其他调用约定中,可以丢弃的只是EDX,EAX和ECX。

EBX确实有一些模糊的隐式用法,这些隐式用法在现代代码(例如 CMPXGH8B / CMPXGH16B)中仍然有用,但是它是32/64位代码中最不特殊的寄存器。

EBX是保留调用的寄存器的不错选择,因为很少有函数需要保存/恢复EBX,因为它们特别需要EBX,而不仅仅是任何非 volatile 寄存器。正如布雷特·黑尔(Brett Hale)的答案所指出的那样,它使EBX成为需要ABI的全局偏移表(GOT)指针的绝佳选择。

在16位模式下,寻址模式仅限于 [BP|BX + DI|SI + disp8/disp16](的任何子集),因此BX在此肯定是特殊的。

关于assembly - x86汇编-为什么[e] bx保留在调用约定中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22214208/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com