引入:对初学编程语言的人来说,他们经常会听到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语言学习,对初学者有不错的启发作用

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐