skip to content
[Jimjimu Notes]
Table of Contents

Course index · Previous: Floating Point · Next: Formats and Logic

架构图

Pasted image 20260426222305

Register

Pasted image 20260426222708 Pasted image 20260426222723 Pasted image 20260426222805 Pasted image 20260426222825

Addition and Subtraction

Pasted image 20260426223012 Pasted image 20260426223024 Pasted image 20260426223037 Pasted image 20260426223050

Immediates 立即数

Pasted image 20260426225144 Pasted image 20260426225158 Pasted image 20260426225213

Memory Addresses are in Bytes

Pasted image 20260426232646

教学上默认地址都为32位

现代计算机(包括绝大多数 RISC-V、x86、ARM 架构)的内存地址绝大多数都是以“字节”(Byte)为单位的。这在计算机体系结构中被称为按字节编址(Byte-Addressable)。 简单来说,内存就像一排连续的信箱,每个信箱里固定只能装 8 个比特位(1 个字节)的数据。每一个信箱都有一个独一无二的编号,这个编号就是“内存地址”。

  • 地址 0x00000000 指向第 0 个字节。
  • 地址 0x00000001 指向第 1 个字节。
  • 地址 0x00000002 指向第 2 个字节。

假设你要存第一个 32 位整数,计算机会给它分配一个起始地址(通常叫作“字地址”,这里是地址 0)。这个整数会被切成 4 块,对号入座:

  • 数据最右边的 0-7 bits (最低有效字节),存进门牌号为 0 的格子。
  • 数据的 8-15 bits,存进门牌号为 1 的格子。
  • 数据的 16-23 bits,存进门牌号为 2 的格子。
  • 数据最左边的 24-31 bits (最高有效字节),存进门牌号为 3 的格子。

存完这第一个整数后,0、1、2、3 这四个格子就被占满了。如果你接着要存第二个 32 位整数,它就会顺延存到上一排的 4、5、6、7 这四个格子里(它的起始地址就是 4)。

Pasted image 20260426232934

Load and Store

Pasted image 20260426233107 Pasted image 20260426235155 Pasted image 20260426235950 Pasted image 20260427000147

解析: 首先x11寄存器存储的是16进制数0x000003f5(一个16进制位=4个2进制位,需要4bit=1word=0.5byte)这里使用sign-extend 接下去将x11存到x5+0这个地址,再load byte,因为是小端序,只load一个byte,offset = 1 byte也就是这个16进制数的后3,4位,0x03,经过sign-extend之后为0x00000003

Decision Making

Pasted image 20260427002222 Pasted image 20260427002241 Pasted image 20260427002301 Pasted image 20260427002329

比大小

Pasted image 20260427002422

Loops

Pasted image 20260427002457 Pasted image 20260427002508

Logical Instructions

Pasted image 20260429102233
  • 操作字(Word)内的特定位段 (fields of bits): 传统的 RISC-V 架构中一个字通常是 32 位。逻辑指令允许你精准地提取或修改这 32 位中的某几位,而不会干扰其他位。
  • 例子: 一个 32 位的字可以容纳 4 个 8 位的字符数据。你可以利用逻辑指令单独“抠出”其中的某一个字符。
  • 数据的打包与解包 (Operations to pack / unpack bits into words): 在底层开发(如配置硬件寄存器或处理网络协议头)时,为了最大化利用存储空间,经常需要把多个状态标志或小数据片段“打包”塞进同一个 32 位寄存器中,或者在需要读取时将它们“解包”出来。
Pasted image 20260429102448 Pasted image 20260429102504 Pasted image 20260429102641 Pasted image 20260429103237

逻辑右移 (srl) 是不管原来的数字是正是负,高位一律无脑补 0。而这张讲的算术右移 (sra, srai) 之所以补符号位,是为了在移位后保持数字原有的正负号不变 在 RISC-V 中只有逻辑左移(sllslli),而没有专门的“算术左移”指令

Machine Program

Pasted image 20260429103846

.s是汇编语言,.o是机器码

Pasted image 20260429103921 Pasted image 20260429104001 Pasted image 20260429104511

Function Calls

Pasted image 20260429104806 Pasted image 20260429104923 Pasted image 20260429105625 Pasted image 20260429105707 Pasted image 20260429105720 Pasted image 20260429110726 Pasted image 20260429110740

jal jal,jalr,j,jr,ret五个指令对比

Stack

Pasted image 20260429112636 Pasted image 20260429112648

stack frame 栈帧

Pasted image 20260429112829 Pasted image 20260429112849

在这一段汇编中,先存了s0,s1的值,是不是因为主程序之前可能在s0,s1存了数据,但是函数需要用s0,s1,先把s0,s1保存起来,函数调用完再恢复

Pasted image 20260429113012

Nested Calls and Register Conventions

Pasted image 20260429113913

问题:外层函数的ra会被内层函数overwritten,因此需要用stack保存ra

Pasted image 20260429114043 Pasted image 20260429114414 Pasted image 20260429114532

Memory Allocation

Pasted image 20260429115704

静态变量 (Static variables): 包括全局变量,以及用 static 关键字修饰的局部变量。它们的寿命贯穿整个程序的运行周期,无论函数进进出出多少次,它们的值都会被一直保留。因为要一直存活,静态变量不存储在栈中,而是存在内存中另一块专属的区域(通常叫数据段 Data Segment)。

Pasted image 20260429115942 Pasted image 20260429120236 Pasted image 20260429120651 Pasted image 20260429120708 Pasted image 20260429120729

memory allocation

RISC-V Instruction Representation

架构图与定位

Pasted image 20260429121021 Pasted image 20260429141335 Pasted image 20260429141347

为了降低硬件设计的复杂度,指令被统一成与数据长度一致的 32 位数字,并且这 32 位数字仅通过 6 种标准化的结构模板来解析。


Course index · Previous: Floating Point · Next: Formats and Logic

Backlinks