使用 GCC 编译一下
gcc -S test_add.c -o test_add.s
然后查看一下主要代码。
movl $1, -12(%ebp)
movl $2, -8(%ebp)
movl -8(%ebp), %eax
movl -12(%ebp), %edx
addl %edx, %eax
movl %eax, -4(%ebp)
其中的 ebp eax edx 就是寄存器。
可以看出,数据先放到栈里,再从栈里放到寄存器里,然后再进行加法运算,最后再从寄存器里把结果放回栈里。
下面的图是书中给出的一个处理器的抽象视图:

栈是什么 栈是一种抽象概念,这里的栈就是指内存。
书里说了,在32位计算机中,这些寄存器的大小就是32位。可见,
字长与寄存器大小一样
除此之外,我们可以看到,需要计算的时候,movl 指令将数据从内存中放到寄存器里,由于内存和寄存器是不同的部件,所以需要一个部件来传递数据,这种部件叫做数据总线。
寄存器的大小与字长相同,那么这种数据总线每次能传送的数据也应该与字长相同,所以:
字长与数据总线宽度一样
另外,再想像一下,你想要从内存中取数据出来,总要告诉内存你取的是哪个地址的数据吧,所以,“地址”这个数据也是要从某个地方传送到内存的。只要传递,就需要有部件支持,这个部件叫做地址总线,地址总线传递地址,地址大小与字长一样,那么,我们可以知道:
字长与地址总线宽度一样
好了,到了这里,我们的分析就差不多了,总结一下:
我们由C语言中int类型的大小,得到了字长这个概念,又从字长这个概念寻找了与其相关的一些机器部件的属性。到现在为此,与字长相关的有:
int 类型
指针(即内存地址)
寄存器
数据总线
地址总线
在 Wikipedia 的 Word(computer_architecture) 词条中,我们可以看到自1837年以来,一系列计算机体系结构中与字长相关的一些属性的变化。
我们再想想,为什么要将这么多种部件都设置成相同长度 我想,可能是因为计算机内部实在太复杂了,各个部件之间需要紧密地配合,共同完成复杂的任务。尤其是数据,需要在各个部件之间传递,如果这些部件之间大小不统一,就会增加机器的复杂度,由于,我们将这些部件大小尽可能统一,进而提出字长这种概念来描述计算机的重要性质。
到这里,我们再想一下,字长这个概念和这么多部件相关,那么确定字长多大应该不仅仅与内存大小有关系。比如字长代表寄存器的大小,寄存器与机器的运算直接相关,字长变大后,每次能参与计算的值也相应变大,以前我们计算两个很大的数的和时,可能需要动用好几个寄存器,现在咱字长大了,寄存器也大了,只需要两个寄存器就可以了。
由此可见,字长的确定是一个综合的考量,代表着计算机计算,存储能力的全面提升。