为什么在汇编中操作寄存器(例如EAX)不会影响其他程序?



假设,例如,我正在将一个值移动到汇编程序的EAX寄存器中:

mov eax, 50 ;move the value 50 into register EAX

处理器的寄存器大概是由其他程序使用的。为什么通过操纵它们的内容,我不会干扰需要使用它们的其他程序?是因为不同的执行线程吗?如果是,具体是如何管理的?

正如您所怀疑的,每个线程都有每个寄存器的自己的副本。这个上下文,正如我们所知,是由操作系统在线程之间切换时保留的。

您可能也想知道"如果您自己使用特定的寄存器,那么调用使用该寄存器的子程序怎么会不影响您自己使用该寄存器呢?"-答案几乎是一样的:每一段修改寄存器内容的代码都是不知道可以自由使用的——因为已经保存在其他地方了——必须保存原始内容,然后将寄存器恢复到以前的值。

"已保存在其他地方"适用于线程,因此您不需要自己保存/恢复。

编译器遵循调用约定,根据编译器和处理器的不同,编译器可能包括一个寄存器列表,这些寄存器可以供函数使用而不保留,而如果使用它们,则必须保留它们(通常在堆栈上,但这取决于实现)。内联汇编,要正常工作,必须以某种方式告诉编译器正在使用什么寄存器(或让编译器选择),以便编译器可以围绕汇编工作,只要寄存器保存规则走,只要函数想要使用的寄存器可能必须改变。线程只是处理器模式(中断和其他异常)的另一个级别,其中的规则通常是保存所有内容的状态,所有寄存器和处理器状态字。因此,如果/当您从执行角度返回被中断的代码时,不知道它已被中断(所有寄存器都被放回它们被发现的方式)。

最新更新