当变量超过 32 个时寄存器会发生什么情况?

str*_*0r3 2 assembly programming-languages mips

编程语言的变量和寄存器之间的一个主要区别是寄存器的数量有限,在当前的计算机(如 MIPS)上通常为 32 个。

这是我学习MIPS语言时读到的。假设有一个程序有超过32个变量,每个变量都存储在一个寄存器中。当没有空寄存器时,其余变量会发生什么?

小智 5

并不是所有的 MIPS 32 寄存器都用来存储变量,有些有特殊用途,如$k0$k1$gp$sp,因此可用于存储变量的寄存器较少。

通常变量不存储在寄存器中,而是通过为函数创建堆栈帧来存储在内存中,如下所示:

# make space of 30 vars, 4 bytes each
addi    $sp, $sp, -4 * 30

# $t0 = 1
addi    $t0, $0, 1

# store vars into the stack
sw      $t0, 0($sp)  # 1
addi    $t0, $t0, 1  # $t0++
sw      $t0, 4($sp)  # 2
addi    $t0, $t0, 1  # $t0++
sw      $t0, 8($sp)  # 3
addi    $t0, $t0, 1  # $t0++
sw      $t0, 12($sp) # 4
#...

# now to access the 4th var, 12($sp), into $t1
lw      $t1, 12($sp)

# do stuff

# deallocate the space and destroy those vars when you done
addi    $sp, $sp, 4 * 30
Run Code Online (Sandbox Code Playgroud)

当您想要更新变量或像计数器一样大量使用它时,您可以将其从内存加载到寄存器中,做您想做的事情,然后更新内存存储的变量。