gpt4 book ai didi

assembly - x86 程序集 - 为什么 [e]bx 保留在调用约定中?

转载 作者:行者123 更新时间:2023-12-05 07:38:44 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/47685181/

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