L8 Storing Data in Memory(lw and ld)
前请提要
回到L7 RISC-V Basics#Addtion and Subtraction
Data Transfer: Load from and Store to memory
图片解释所有
Memory Addresses are in Bytes
fast facts,跟mips一模一样,都是按byte寻址
Big Endian vs. Little Endian
check for c Lab4 makefile#Big-Endian and Little-Endian
Load and store
Loading and Storing Bytes
在 RISC-V 中,lbu
和 lb
的区别就在于 如何扩展数据:
1. lbu
(load byte unsigned)
- 无符号加载字节。它从内存中加载一个 8 位(1 字节)数据到寄存器。
- 扩展方式:将高位 零扩展,也就是说,除了加载的 8 位数据以外,寄存器中的剩余位都填充为 0。
- 例如,如果内存中的 8 位数据是
0x7F
(127,无符号表示),那么加载到寄存器中会变成0x0000007F
。
2. lb
(load byte)
- 有符号加载字节。同样从内存中加载一个 8 位(1 字节)数据到寄存器。
- 扩展方式:根据加载的 8 位数据的第八位(最高位,也就是符号位)进行 符号扩展。
- 如果最高位是
0
,那么高位扩展为 0。 - 如果最高位是
1
,那么高位扩展为 1,即对符号位进行扩展。
- 如果最高位是
- 例如,如果内存中的 8 位数据是
0xFF
(-1,有符号表示),那么加载到寄存器中会变成0xFFFFFFFF
。
冷笑话
注意右边小方框的冷笑话/脑筋急转弯
为什么有lbu没有sbu?
因为 sb
(存储字节),只是将寄存器中的低8位写入内存,不管寄存器中的值是有符号的还是无符号的。存储字节操作并不涉及符号扩展,因为你只是单纯地将数据字节从寄存器写入内存,不需要进行进一步处理。