[英]How does data get into the General Purpose and other registers so that the CPU can use it for computing values?
我知道寄存器用作 CPU 访问数据以执行指令的存储单元。 这些指令的汇编语言类似于 ADD R2, R1, R3,本质上是要求我们在 R1 和 R3 中添加内容并将其放入 R2。 我的问题是,数据如何进入寄存器 R1 和 R3,以便 CPU 可以使用这些值来计算结果并将结果存储在 R2 中? 如果所有寄存器都已满,是否使用类似于从缓存中清除数据的 LRU 方法将数据从寄存器中清除到主 memory?
值使用机器代码指令进出寄存器; 机器代码指令可以:
如果所有寄存器都满了
这在某种程度上取决于您所说的完整。 从某种意义上说,寄存器始终保存值, CPU中没有空闲/忙碌寄存器的概念(以浮点和向量寄存器的一些深层概念为模) 。 您的硬盘驱动器也是如此。 它正好有 N GB 的存储空间,就硬件而言,这个数字永远不会增长或缩小。
如果所有寄存器都已满,是否使用类似于从缓存中清除数据的 LRU 方法将数据从寄存器中清除到主 memory?
是的,但几乎 100% 在程序控制下:程序知道我们算法中的哪些逻辑变量在 CPU 寄存器中(以及其他在 memory 位置),因此有一个算法转换为具有足够寄存器的程序集的概念(留下一些未使用的)并且还想要比可用的更多的寄存器。 当发生这种情况时(希望超过可用的),编译器编写者和汇编程序员只需转向 memory 进行溢出,编写机器代码指令以根据需要来回传输数据。 不重要的事情可以存在于 memory 中,并且访问时间变慢,从而可以根据需要使用 CPU 寄存器。
(在硬盘驱动器的类比中,所有位始终存在,但并不总是有意义的使用。)
需要明确的是,硬件有许多 LRU 算法,但这些通常围绕缓存架构,包括 L1、L2 和 TLB。
通用寄存器在概念上与编程语言中的变量非常相似
R1 = 3
R3 = 5
R2 = R1 + R3
如何将这些值放入寄存器取决于架构和值。 一些指令集具有可变长度指令,可以支持任何可能的值
mov r1,0x12345678
别人可以加载半个寄存器
lui r1,0x12340000
对于真正的处理器来说语法不正确,但是 ISA 将允许控制上半部分,然后您将使用
ori r1,0x5678
最终结果是 r1 = 0x12345678
另一种解决方案是从附近的位置加载
ldr r1,hello
...
hello: .word 0x12345678
这将使用 pc 相对寻址,汇编程序会在生成指令时为您进行数学运算,但例如实际指令将类似于从 pc+16 地址的 memory 加载到寄存器 r1 中。
寄存器是离散的,它们的数量是固定的,它们没有被缓存或先进先出或类似的东西。
从程序员或编译器的角度来看,如果您只有 8 个寄存器,并且您管理的数据项、变量、地址等超过 8 个,并且您使用的架构要求您使用寄存器一切,那么您通常会使用堆栈来临时存储变量。
r1 = 0x12345678 (variable hello)
r2 = 0x55443366 (variable world)
...
I need another variable as the programmer I decide that I can live with out hello for a while
push {r1}
r1 = r2+r3 (variable foo)
str r1,[r4] (the computed value was generated to store in memory)
foo is no longer neaded, but I need hello back
pop {r1}
采用高级语言并生成低级语言(通常是汇编语言或机器代码)的编译器将通过 function 和 select 来跟踪变量,这些寄存器在何时使用。 在 function 的执行过程中,一个特定的寄存器可能会保存多个变量或地址或其他数据……显然一次只能保存一件事。 我们会像人类一样用手做同样的事情,但要根据算法。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.