参考于:
新人最近刚学机组,发现这几个概念不太清楚,特地学习借鉴了前面的大佬们的博客。
且仅以个人理解,若有不正确之处,欢迎指出。
机器字长、存储字长、指令字长
概念
-
机器字长:CPU进行一次整数运算所能处理的二进制数据的位数
- CPU总线的宽度=运算器的位数=通用寄存器的宽度=数据总线宽度
- 字长:不加修饰的一般为机器字长。
- CPU总线的宽度=运算器的位数=通用寄存器的宽度=数据总线宽度
-
字:字是指在计算机中作为一个整体被存取、传送、处理的一组二进制数。它代表计算机处理指令或数据的二进制数位数,字长是由CPU的类型所决定,不同的计算机系统的字长是不同的,常见的有8位、16位、32位、64位等,字长越长,计算机一次处理的信息位就越多,精度就越高,
- 注意字与字长的区别,字是单位,而字长是指标。
-
存储字长:一个存储单元中二进制代码的位数(通常和MDR位数相同)
- 存储字长不一定与机器字长相同(这也就出现了后面的主存容量扩展的问题(位扩展)),具体需要看机器的编址方式。一般情况下都是存储字长小于等于机器字长,即存储字长小于等于数据总线位数。
- 存储字长一般不固定的,固定的是每个字里面的字节大小(1字节=8bit)
-
数据字长:计算机数据存储所占用的位数。
-
存储单元:存放存储字或存储字节的主存空间被称为存储单元或主存单元。是CPU访问存储器的最小单位。因此每个存储单元都有对应的地址。至于具体存放什么这是由计算机的结构确定的。存储字或存储字节也可以理解为存储元集合,因此,存储单元也可以说是存放一个机器字的所有存储元集合(一般情况下存储字长等于机器字长)
-
存储元:存储元指的是存放一个二进制位(1或0)的基本器件(或电路)也被叫做存储元
- 由若干个存储元组成一个存储单元,然后再由许多存储单元组成一个存储器。
-
存储容量:对于字节编址的计算机,以字节数来表示存储容量;对于字编址的计算机,以字数与其字长的乘积来表示存储容量。
即 存储容量 = 存储单元个数 ∗ 存储字长 ( 或 = 存储单元个数 ∗ 存储字长 / 8 ) 存储容量=存储单元个数*存储字长(或=存储单元个数*存储字长/8) 存储容量=存储单元个数∗存储字长(或=存储单元个数∗存储字长/8)
或 字数 ( 存储单元个数 ) = 存储容量 / 字长 字数(存储单元个数)=存储容量/字长 字数(存储单元个数)=存储容量/字长
-
指令字长:一条指令的总长度,指令字长取决于操作码、操作数地址的长度和操作数地址的个数。
- 半字长指令、单字长指令、双字长指令 ——指令字长是机器字长的多少倍,如双字长指令:指令字长为机器字长的两倍
- 指令字长会影响取指时间,如:机器字长=存储字长=16bit,则取一条双字长指令需要两次访存操作
-
地址线: 存储单元的个数 = 存储容量 = 2 地址线条数 存储单元的个数=存储容量=2^{地址线条数} 存储单元的个数=存储容量=2地址线条数 ,若一个CPU有N根地址线,则CPU的地址总线宽度为N,可以寻址 2 N 2^N 2N个内存单元,即每一条地址总线都对应着一个存储单元。
-
数据线:数据总线位数代表cpu单次交换数据量。数据线的条数=机器字长的位数
(注意
1:MDR与数据总线宽是不一定一样的,只与数据的个数有关,且和存储字长位数一样,如果数据线宽度和MDR不一样,那么就代表传一个数据要传多次。
评论有句生动形象的描述:“高速路上的车流量(MDR:位于CPU内)和出高速路口的车流量(总线:位于CPU外)是不一样的”
2:存储字长一般小于等于数据线宽度
)
-
存储器数据寄存器 MDR(Memory Data Register-MDR (或MBR) ):用于存放主存单元中的数据的寄存器
按字编址、按字节编址、按字寻址、按字节寻址
- 存放一个机器字的存储单元,通常称为字存储单元,相应的单元地址叫字地址。
- 存放一个字节的存储单元,称为字节存储单元,相应的地址称为字节地址。
- 如果计算机中可编程的最小单位是字存储单元,则该计算机称为按字寻址的计算机。
- 如果计算机中可编程的最小单位是字节,则该计算机称为按字节寻址的计算机。
个人通俗理解:编址是内存的事(涉及存储字长),以便CPU能正常访问它;而内存寻址是CPU的事(涉及机器字长)。
区分寻址空间与寻址范围两个不同的概念,寻址范围仅仅是一个数字范围,不带有单位
而寻址范围的大小很明显是一个数,指寻址区间的大小
而寻址空间指能够寻址最大容量,单位一般用MB、B来表示
所谓按字和按字节只是寻址范围的计量标准不同而产生的寻址范围数不同而已,其本质上总量还是一样的。
机器字长是否等于存储字长具体得看编址方式的,一般而言机器字长为存储字长的倍数。
按字节连续编址
以一个字节的长度来划分主存,即存储空间的最小编址单位是字节
此时,一个存储字长为一个字节大小
如,IBM 370机的机器字长为 32 32 32位,若按字节( 1 b i t = 1 B 1bit=1B 1bit=1B)编址。则一个存储单元中存放一个字节,即放八位,如下表。注:存储字长是CPU一次访问内存可以读取的数据量。又由于机器字长为32位,即CPU一次运算可以处理32位的数据,而上述按字节编址存储字长为 8 b i t 8bit 8bit,所以32位的数据CPU共需要通过数据线传输 32 8 = 4 \frac{32}{8}=4 832=4次
1B | 1B | 1B | 1B |
---|---|---|---|
1B | 1B | 1B | 1B |
上面提到过,每个存储单元都有与之唯一对应的地址,由于数据从低位到高位可以从左往右排序,也可以从右往左排序,因此无法用最左或最右来表征数据的最高位或最低位,所以关于编址方式又分为了小段方式与大端方式。
大端模式(便于人类阅读):按从最高有效字节到最低有效字节的顺序存放数据,即最高有效字节放在前面
小端模式(便于机器处理):按从最低有效字节到最高有效字节的顺序存放数据,即最低有效字节放在前面
还是以上面IBM 370机为例子。
假设第一个存储单元首地址为 0800 H 0800H 0800H且地址以十六进制形式表示,
有一个double型的数据(占64位): 00 00 00 01 01 01 02 02 02 03 03 03 04 04 04 05 05 05 06 06 06 07 H 07H 07H 存放在该机中
下面展示两种存储方式。
大端模式:(注:粉色的为地址编号,单元格中存放的为数据内容,由于一位十六进制数对应4个二进制数,故对于一个大小为8为的单元格可以存放两个十六进制数,下同)
【图 1】
小端模式:
【图 2】
按字连续编址
以存储字长(这里默认等同于机器字长 32 b i t 32bit 32bit)的长度来划分主存,即存储空间的最小编址单位是一个字(同理,双字编址就是以两个字位最小编址单位),即一个存储单元的大小为一个字,从0号单元开始编址。0号单元一个字大小,1号单元一个字大小。。。
还是以IBM 370机为例子。
【图 3】
按字寻址
一组地址线的每个不同状态对应一个字的地址,存储空间的最小编址单位是字。
因为计算机在寻址的过程中,会区分字里面的字节,这样就会占用一部分的地址线。
它每一个存储字包含4个可以独立寻址的字节,
【图 4】
例子
IBM 370机的机器字长为32(注:字长这一条件只有在按字寻址的前提下才有用),若按字节寻址,32bit=32/8=4个字节。故需要 l o g 2 4 = 2 log_24=2 log24=2条地址线来区分字内字节地址。
如果此时假设其有24根地址线,则真正按字寻址的地址线只有22条(24-2,有 H两条用于区分字内地址)。故寻址范围为: 2 22 W 2^{22}W 222W (W是字长的意思)
按字节寻址
一组地址线的每个不同状态对应一个字节的地址,存储空间的最小编址单位是字节。
对于按字寻址所讨论的例子来说,按字节寻址就无需单独留出地址线用于区分字内地址了,因此真正用于寻址的地址线有24条,故寻址空间为: 2 24 B 2^{24}B 224B
一些连接图
主存与CPU连接图
【图 5-1】(存储器按字节编址,机器字长64位)
【图 5-2】(存储器按字编址(一字8bit),机器字长8位)
例题
例1
1MB容量的存储器字长为32位,问
1)按字节编址,地址寄存器和数据寄存器各几位?编制范围为多大?
2)按字编址,地址寄存器和数据寄存器各几位?编制范围为多大?
3)按半字编址,地址寄存器和数据寄存器各几位?编制范围为多大?
[解]
1)若按字节编址:
1 字节 = 1 B = 8 b i t 1字节=1B=8bit 1字节=1B=8bit
1 M B = 2 20 × 8 位 1MB=2^{20}×8位 1MB=220×8位 因为以字节编址,所以寄存器一次只能读写一个字节大小,故数据寄存器为8位;编址范围为: 0 0 0~ ( 2 20 − 1 ) (2^{20}-1) (220−1) 因此需要20根地址线才能编址1MB空间,即地址寄存器为20位。
2)若按字编址:
1 字 = 32 位 = 4 B 1字=32位=4B 1字=32位=4B
1 M B = 2 18 × 32 位 1MB=2^{18}×32位 1MB=218×32位 因为以字编址,所以寄存器一次只能读写一个字大小即32位,故数据寄存器为32位;
所以编址范围为: 0 0 0~ ( 2 18 − 1 ) (2^{18}-1) (218−1) 又或者是 2 20 B / 4 B = 2 18 2^{20}B/4B=2^{18} 220B/4B=218 ,故需要18根地址线才能编址1MB空间。
3)若按半字编址:
半字 = 16 位 = 2 B 半字=16位=2B 半字=16位=2B
因为以半字编址,所以寄存器一次只能读写半各字大小即16位,故数据寄存器为16位;
与2)同理: 2 20 B / 2 B = 2 19 2^{20}B/2B=2^{19} 220B/2B=219 ,故需要19根地址线才能编址1MB空间。
注意,类似于询问编址范围,还有这类的问法“求其寻址单元数?1) 2 20 个 2^{20}个 220个 ;2) 2 18 个 2^{18}个 218个;3) 2 19 个 2^{19}个 219个”
例2
对于24位地址线的主存而言
1、若字长为32位:
1-1)按字节寻址的范围为16M。( 2 24 B = 16 M 2^{24}B=16M 224B=16M)
1-2)按字寻址的范围为4M。 ( 2 24 B / 4 B = 4 M 2^{24}B/4B=4M 224B/4B=4M)
2、若字长为16位:
2-1)按字节寻址的范围为16M。( 2 24 B = 16 M 2^{24}B=16M 224B=16M)
2-2)按字寻址的范围为4M。 ( 2 24 B / 2 B = 8 M 2^{24}B/2B=8M 224B/2B=8M)