初识寄存器,字,大端小端(csapp第二版)


寄存器的处理速度相当快,它的基本单元是D触发器,操作速度快,但是存储容量小,占用面积大,所以数量相较而言较少。

Picture2


(ppt来自湖南大学黄丽达老师教授的计算机系统)

从图中可以看出,我们的8个32位寄存器都有固定的名称。通常来说,寄存器都是由它的名称代表,而不说它的地址,地址常见于指代内存的存储单元。

学习汇编的时候我们需要对存储器的位数、名称、以及一个存储器的内部的各个小部分十分熟悉。

例如我们的%eax,这是我们所说的(x86)32位CPU中包含一组8个32bit的通用寄存器里面的一个寄存器。它是32位的。其中,这个存储器的低16位也可以用%ax来代表。然而低16位里面又可以分为两个部分,高8位叫做%ah,低8位我们叫做%al。

 

picture3


(图片来自于湖南大学黄丽达老师教授的计算机系统)

字长

字长是指cpu的每个字所包含的位数。根据计算机的不同,字长有固定的和可变的两种。固定字长,即字长度不论什么情况都是固定不变的;可变字长,则在一定范围内,其长度是可变的。

计算的字长是指它一次可处理的二进制数字的数目。计算机处理数据的速率,自然和它一次能加工的位数以及进行运算的快慢有关。如果一台计算机的字长是另一台计算机的两倍,即使两台计算机的速度相同,在相同的时间内,前者能做的工作是后者的两倍。一般地,大型计算机的字长为32―64位,小型计算机为16―32位,而微型计算机为4一16位。字长是衡量计算机性能的一个重要因素。(百度百科)

可以看出,我们固定的是,一位就是一个bit,一个字节byte就是8位。字长的大小是不确定的。而且cpu一次操作处理的实际位数一定和字长一致。也就是说,你的计算机是多少位的,那么你计算机的字长就是多少位,意味着cpu一次操作可以处理多少位数据。

 

picture4


(图片来自于湖南大学黄丽达老师教授的计算机系统)

大端和小端的问题。

这个例子挺灵活的。

首先我们需要对几个条件熟悉。首先Intel系列机器一般是小端存储的。其次这里是单子单元,(课程默认单字为16位),那么就是8bit+8bi=1byte+1byte也就是两个内存的存储单元。我们的起始地址为0x56782,又因为我们计算机都是从低地址读到高地址,那么从0x56782读取到0x56,从0x56783读取到0x29,那么我们现在处理一下哪个数是高位,哪个数是低位。

因为Intel系列机器是小端存储,所以高位存储在低地址。所以说0x29是高位,从而读取的数据为

0x2956

 

这里有一个地方想强调一下,大端小端是指计算机的存储方式,但是读取的话都是从低地址读取到高地址的。这是一个要注意的点。