简要介绍大端小端存储与寄存器、Load/Store单元的关系
·
引入:对初学编程语言的人来说,他们经常会听到64bit系统和32bit系统的说法,这关乎寄存器与内存之间的值传递,本文章将会简要介绍寄存器,大小端存储与Load/Store单元的关系。
寄存器:是CPU中的高速存储单元,而64bit系统的寄存器存储大小为64bit,即8字节
从内存到寄存器的路径
内存<------>数据总线<------>Load/Store单元<------>寄存器
先引入大小端的概念
这是一串16进制数:
高位(msb)0x12345678低位(lsb)
地址从低到高
大端存储:低地址|12|34|56|78|高地址
小端存储:低地址|78|56|34|12|高地址
一般而言,个人计算机是小端存储,低位放低地址,高位放高地址,利好计算机处理,性能有优势
而网络传输是大端存储,就像上面那样,地址增长方向与阅读习惯一致,可读性强
大小端说明了什么?
对一段多字节,地址内怎么存储这些字节
对内存到寄存器过程影响了下面两点
1.内存怎么存
2.Load/Store单元怎么排列地址(通俗来说就是进行拆装)
注意这两件事是硬件决定的,即大小端是对硬件而言而不是对操作系统
表格归纳
| 作用 | 与大小端的关系 | |
|---|---|---|
| 内存 | 存储字节 | 大小端决定字节在地址怎么存储 |
| 数据总线 | 传输内存的字节排列 | 负责搬,跟大小端无关 |
| Load/Store单元 | 排列内存的字节传给寄存器,或把寄存器的字节序拆开给数据总线并传给内存 | 大小端决定了它怎么拆装 |
| 寄存器 | 接收Load/Store单元所传,交给CPU内的ALV进行运算 | 无关,只负责存 |
简单对比联合体(共用体)与结构体
在早期计算机发展时,内存珍贵,为了最大程度利用内存,出现了联合体
联合体(共用体):在同一块内存中存储不同类型的变量。
注意:不是一块内存同时存储不同类型的变量,被什么类型占了就是什么,以最后一次赋值为准,故联合体内变量不能同时用
结构体:划分多个内存存储其中变量,结构体内存为其成员内存(对齐)之和
结构体内变量可以同时使用
用例:利用联合体判断计算机是大端存储还是小端存储
union A {
short s;
char c[2]
};
union A a1;
a1.s = 0x1234;//赋值给s(short型2字节),判断c(char型1字节),看共用内存里数组c怎么排
if (a1.c[0]=34) {//数组内元素地址按从a[0]到a[1]升高
printf("是小端存储");
}
else {
printf("是大端存储");
}
总结:
通过了解内存,寄存器,Load/Store单元对数据的传输,能够更深入的关联硬件与C语言学习,对初学者有不错的启发作用
openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐


所有评论(0)