寄存器和内存,RISC-V
register and memory, risc-v
我在大学学习计算机体系结构,我想我不知道计算机系统和 C 语言概念的基础,很少有事情让我感到困惑,我一直在寻找它但找不到答案我想要什么,让我更加困惑,所以在这里上传问题。
1。我认为寄存器在 CPU 中保存指令、存储地址或任何类型的数据。我还学习了内存布局。
--------------------
堆栈
动态数据
静态数据
文字
保留部分
--------------------
那么寄存器在CPU中有这样的内存布局?或者我只是将它与计算机的 5 个组件(输入、输出、内存、控制、数据路径)的内存布局混淆了。我认为这是这 5 个组件的布局之一。
RISC-V(在 C 中循环)
Loop:
slli x10, x22, 3
add x10, x10, x25
ld x9, 0(x10)
bne x9, x24, Exit
addi x22, x22, 1
beq x0, x0, Loop
Exit:...
那么这个操作发生在哪里呢?注册?
- 我学习了如下的 RISC-V 寄存器。
- x0:常量值0
- x1: return 地址
- ...
- x5-x7, x28-x31: 临时
- ...
如果register在我上面画的那个内存布局里,那么x0,x1的东西在哪呢?从这里看没有意义。所以我很困惑我必须如何看待寄存器的样子。
一切在我脑海中都是那么抽象,所以我想这个问题听起来有点奇怪。有什么不明白的,请评论我。
Then register is having this memory layout in CPU?
不,那是零意义,你的思路错了。
寄存器文件是它自己独立的space,不是内存地址的一部分space。它不能用变量索引,只能通过将寄存器编号硬编码到指令中,所以 x2
是 "next register after x1
" 或任何东西都没有任何意义。例如你不能遍历寄存器。 它们只是两个独立的 32 位或 64 位数据存储 space,软件可以随心所欲地使用它们。
将它们分解的自然类别基于软件/调用约定:
- 堆栈指针
- 调用保留寄存器(函数调用不会修改它们,或者相反,如果你想在函数中使用一个,你必须 save/restore 它)
- 被调用破坏的寄存器(必须假定函数调用会踩到它们,反之可以在没有saving/restoring的情况下使用)
- 零寄存器。
还有 arg 传递与 return 值寄存器。
我在大学学习计算机体系结构,我想我不知道计算机系统和 C 语言概念的基础,很少有事情让我感到困惑,我一直在寻找它但找不到答案我想要什么,让我更加困惑,所以在这里上传问题。
1。我认为寄存器在 CPU 中保存指令、存储地址或任何类型的数据。我还学习了内存布局。
--------------------
堆栈
动态数据
静态数据
文字
保留部分
--------------------
那么寄存器在CPU中有这样的内存布局?或者我只是将它与计算机的 5 个组件(输入、输出、内存、控制、数据路径)的内存布局混淆了。我认为这是这 5 个组件的布局之一。
RISC-V(在 C 中循环)
Loop:
slli x10, x22, 3
add x10, x10, x25
ld x9, 0(x10)
bne x9, x24, Exit
addi x22, x22, 1
beq x0, x0, Loop
Exit:...
那么这个操作发生在哪里呢?注册?
- 我学习了如下的 RISC-V 寄存器。
- x0:常量值0
- x1: return 地址
- ...
- x5-x7, x28-x31: 临时
- ...
如果register在我上面画的那个内存布局里,那么x0,x1的东西在哪呢?从这里看没有意义。所以我很困惑我必须如何看待寄存器的样子。
一切在我脑海中都是那么抽象,所以我想这个问题听起来有点奇怪。有什么不明白的,请评论我。
Then register is having this memory layout in CPU?
不,那是零意义,你的思路错了。
寄存器文件是它自己独立的space,不是内存地址的一部分space。它不能用变量索引,只能通过将寄存器编号硬编码到指令中,所以 x2
是 "next register after x1
" 或任何东西都没有任何意义。例如你不能遍历寄存器。 它们只是两个独立的 32 位或 64 位数据存储 space,软件可以随心所欲地使用它们。
将它们分解的自然类别基于软件/调用约定:
- 堆栈指针
- 调用保留寄存器(函数调用不会修改它们,或者相反,如果你想在函数中使用一个,你必须 save/restore 它)
- 被调用破坏的寄存器(必须假定函数调用会踩到它们,反之可以在没有saving/restoring的情况下使用)
- 零寄存器。
还有 arg 传递与 return 值寄存器。