gpt4 book ai didi

assembly - 为什么子程序调用时没有保存完整的上下文?

转载 作者:行者123 更新时间:2023-12-02 21:45:24 24 4
gpt4 key购买 nike

在子例程调用时,我们保存 PC 的内容,以便重新启动我们的调用例程。但是,如果被调用的子程序更改了通用寄存器的值,会发生什么情况呢?如果调用子例程必须访问存储在寄存器中的旧值,难道不会给调用子例程带来任何问题吗?

最佳答案

But what happens if the called subroutine changes the value of general purpose registers?

这取决于子例程修改哪些寄存器。取决于calling convention ,有一个子例程根据契约(Contract)有义务不修改的寄存器列表(以及子例程可以自由修改的另一个寄存器列表)。

如果子例程不遵守此约定并修改了它不应该修改的寄存器,那么就会发生不好的事情。

如果子程序想要使用它不得修改的寄存器,它必须首先将这些寄存器值保存到堆栈中。保存寄存器值后,就可以使用寄存器来获取新值。当子程序完成时,必须使用堆栈中保存的值来恢复原始寄存器值。这样,子例程可以根据需要使用寄存器,但对于调用者来说,寄存器没有可观察到的修改。

Don't it cause any problem to the calling subroutine if it have to access the old values stored in the registers?

只要子例程遵循调用约定,就不会。如果子例程不这样做,并且它破坏(或“破坏”)“保留”寄存器中的原始值,那么是的,它会导致问题。

不过,并非所有寄存器都必须保留。根据调用约定,某些寄存器可以由子例程修改。如果这些寄存器对调用者很重要,那么调用者必须在调用子程序之前将这些寄存器保存到堆栈中,然后在调用子程序后使用堆栈恢复寄存器值。

关于assembly - 为什么子程序调用时没有保存完整的上下文?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33930622/

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