我是汇编编程的初学者,并且想知道单个EAX通用寄存器可以容纳多少和多少.作为初学者,似乎每个eax,ebx等只有一个.寄存器.
这些是逻辑寄存器名称.你是对的,假设每个正在运行的线程在程序的任何给定点都有一个有效的RAX值(顺便说一句 - 超线程这意味着每个核心两个),但实际上现代HW不包含单个值而是多个值.
现代无序CPU将尝试基于源准备执行指令,因此对于下一个程序,例如:
mov rax, 1 ; #1
add rax, 2 ; #2
mov rax, 3 ; #3
add rax, 4 ; #4
Run Code Online (Sandbox Code Playgroud)
一旦解码,CPU就可以执行指令#1和#3,因为它们不需要满足任何依赖性(并且在旧的值上运行rax).另外,指令#2可以在之后并行执行,因为每个指令仅取决于前面的指令.但是,为了允许在HW中,您需要能够将结果保存在某个临时寄存器中 - 因为它们想出了register renaming- 而不是调用每个操作的结果rax,每条指令将分配一个带有一些唯一ID的新物理寄存器,并更新一些现在由物理寄存器#37或其他表示的全局表(通常称为RAT- 寄存器别名表)rax.
重要的是必须使用正确的版本维护源代码,因此它们也会在同一时刻重命名.指令#2不会使用rax,而是使用inst#1的目的地.Inst#4将类似地使用inst#3的结果.如果您接受重命名是按顺序完成的,并且别名已正确更新,则很容易看到从逻辑寄存器名称到物理寄存器名称的每次转换都保持正确的程序顺序.
因此,虽然rax对于流水线中的每条指令都有一个"正确"的寄存器,但这不一定是相同的物理寄存器.从某种意义上说,您可以说您拥有逻辑寄存器的多个不同副本,每个副本仅在下一次写入相同逻辑名称之前有效.