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

时间:2014-06-18 10:59:29

标签: multithreading assembly architecture

例如,假设我正在将一个值移入程序集中的EAX寄存器中:

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

大概是其他程序使用处理器的寄存器。如何通过操纵他们的内容我不干涉其他需要使用它们的程序?是因为不同的执行线程,如果是这样,这究竟是如何管理的?

3 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:3)

你可能也想知道"为什么会这样 - 如果你自己使用一个特定的寄存器 - 调用一个使用该寄存器的子程序并不会干扰你自己对该寄存器的使用?" - 答案几乎相同:修改寄存器内容的每一段代码都是未知的 - 因为已经在其他地方保存过 - 必须保存原始内容,然后将寄存器恢复到之前的值。

"已经在其他地方保存了#34;是适用于线程的,因此您不需要自己保存/恢复。

答案 2 :(得分:0)

编译器遵循一个调用约定,根据编译器和处理器可能包含一个寄存器列表,这些寄存器可以在不保留的情况下自由使用,而其他寄存器如果使用它们则必须保留它们(通常在堆栈上但是由实施决定)。内联汇编,为了正常工作,必须以某种方式告诉编译器正在使用哪些寄存器(或让编译器选择),以便编译器可以在寄存器保留规则的范围内处理汇编,并且就寄存器而言想要用于事物的功能可能需要改变。线程只是处理器模式以及处理器模式(中断和其他异常)的另一个级别,其中规则通常是保存所有内容,所有寄存器和处理器状态字的状态。因此,如果/当您返回从执行站点中断的代码时,不知道它已被中断(所有寄存器都以它们被找到的方式放回)。