一、寄存器与内存
1.1 字节与字
关于对字(word)的理解,我又有了新的认识,word 是一种操作单位,而且是最常见的操作单位(不是最小的),内存的地址是用一个字(32 位二进制数)来表示的,一条指令的长度是一个字,寄存器的大小也是一个字,立即数的大小也是一个字,甚至对于那些不足一个字长度的数据,我们都需要给它补齐,然后再对它进行操作。所以字最大的特点就是它的通用性。
那么什么是字节(byte)呢?字节是指令集的最小单位。这个观点是花了很久才意识到的,因为我知道数据是按二级制表示的,那么如果把位(bit)作为最小单位,岂不是理所当然。但其实就是不是的,这可能是因为我们需要更简洁更优雅的指令抽象,所以就舍弃了对单独一个位的操作,就好像数字电路舍弃了异步和连续一样。注意,字节不但是操作的最小单位(可能不准确,我还没想到太明显的操作字节的指令),而且是指令集的最小单位,比如我们说 0x00000000 和 0x00000001 这两个地址差 1,那么这个 1 就是 “1 个字节”,也就是这两个地址之间差了 8 个 bit。而不是 1 个 bit。再比如说,我们都说 int 是 4 字节,char 是 1 字节,我们从来不说 int 是 32 位,char 是 8 位,可见更高层次抽象的高级语言,就更不把位当回事请了。
然后我们还需要一些直观的认识,一个字节是 8bit,也就是说,他的能表示 256 个不同的状态,如果写成一个十六进制数,那么他可以表示任何一个两位的十六进制数,也就是长成这个样子 XX。在 MIPS 中,一个 word 是由四个字节组成的,也就是说,我们去写一个十六进制数,它应该长成这个样子 0x XX_XX_XX_XX 。一个 word 的大小是跟一个 int 一样大的,同时,它跟 MIPS 中的立即数是一样大的,也就是说,一个 word 刚好能存一个数字(开数组的时候会用到)。但是可以存 4 个字符,这是因为字符只占一个字节。