数据如何进入通用寄存器和其他寄存器,以便 CPU 可以使用它来计算值?

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 方法将数据从寄存器逐出到主内存,类似于从缓存中逐出数据的方式?

值使用机器代码指令进入和离开寄存器;机器码指令可以:

  • 将程序中的常量输入寄存器或内存
    • 这些通常称为立即加载或移动
  • 将用户输入(如击键)输入寄存器或内存
    • 一些处理器有输入指令,其他处理器从内存映射加载I/O
  • 从内存中加载数据,long-lived 变量和数据结构所在的位置
  • 将寄存器值发送到内存
    • 更新数据结构和其他 long-lived 变量
  • 将数据发送到输出设备(如控制台)
  • 根据现有值计算新值

And if all registers get full

这在某种程度上取决于您所说的完整是什么意思。从某种意义上说,寄存器总是保存值,CPU 中没有空闲/忙碌架构指定寄存器的概念 (模数关于浮点和矢量寄存器的一些深层概念,以及 OoO 处理器和寄存器重命名的内部实现细节)。您的硬盘驱动器也是如此。它恰好有NGB的存储空间,就硬件而言,这个数字永远不会增长或缩小。

And if all registers get full, is data evicted to main memory from the registers using an LRU method similar to how data from caches are evicted?

是的,但实际上 100% 在程序控制下:程序知道我们算法中的哪些逻辑变量在 CPU 寄存器中(以及其他在什么内存位置),因此有一个算法的概念翻译成汇编有足够的寄存器(留下一些未使用的)并且还需要比可用的更多的寄存器。当这种情况发生时(想要的比可用的更多),编译器编写者和汇编程序员只需转向内存来处理溢出,编写机器代码指令以根据需要来回传输数据。不重要的东西可以存在于内存中并且访问时间较慢,允许 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-relative 寻址,汇编程序会在生成指令时为您进行数学计算,但例如,实际指令将类似于从 pc+16 地址处的内存加载到寄存器 r1.

寄存器是离散的,它们的数量是固定的,它们没有缓存或 fifo 或类似的东西。

从程序员或编译器的角度来看,如果您只有 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}

采用高级语言并生成低级语言(通常是汇编语言或机器代码)的编译器将通过函数跟踪变量,并 select 注册何时使用。一个特定的 在一个函数的执行过程中,寄存器可能包含多个变量或地址或其他数据……显然只有一件事 一次。我们会像人类一样用手做同样的事情,但根据 一种算法。