汇编寄存器初学者

标签 assembly cpu-registers

所以我最近开始接触一些汇编,我是一个初学者,所以我想知道是否有人可以澄清一些事情。我认为每个进程都有自己的一组寄存器,并且每个线程都可以修改这些寄存器,对吧?那么多个线程如何使用相同的寄存器而不引起冲突呢?或者每个线程都有自己的一组寄存器?

最佳答案

线程上下文切换涉及保存当前执行上下文的寄存器,以及从开始切换到的执行上下文加载具有保存值的寄存器。 (除其他事项外)。因此每个线程实际上都有自己的一组寄存器。还有它自己的堆栈,因为 ESP 是寄存器之一。

考虑这个问题的一种方法是,通过保存当前寄存器状态并用新状态加载寄存器来获取线程。如果这种情况没有发生,那么它不是线程切换。如果您还切换到一组不同的虚拟地址表,那么您拥有的是进程切换而不是线程切换。

你说:

I take it every process has it's own set of registers, and each thread can modify these registers right?

但这不太正确。每个 CPU 核心都有一组寄存器。每当操作系统切换到不同的线程时,这些寄存器都会更改。但在任何时刻,CPU 核心中都只有一个线程在执行。进程实际上并没有自己的寄存器,进程拥有自己的线程(或至少一个线程),并且线程有寄存器,或者更确切地说,在线程等待 CPU 核心可用时保存寄存器值的地方继续运行。

关于汇编寄存器初学者,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2406128/

相关文章:

assembly - 页边界上的 pdp8 mri 指令

c - ret2eax 的问题

assembly - 使用段寄存器(今天)有什么好处?

windows - 为什么Windows在新的x64进程中使用RCX、RDX作为指针,与新创建的32位进程中的EAX、EBX不同?

gcc - 内联汇编错误,阻止 gcc 编译尝试

gcc - 了解 GCC 的 alloca() 对齐和看似错过的优化

c++ - 切换 C++ 函数的调用堆栈

assembly - 使用 asm 指令读取 MIPS CPU 寄存器

gcc - PowerPC GCC 在没有 % 符号的汇编中打印寄存器

assembly - 为什么我们必须在MS-DOS 中初始化DS 和ES 寄存器?