例如,对于8位CPU,堆栈大小预计为8位宽,16位CPU与16位堆栈宽度,32位,64位CPU等等。所有架构都适用吗?
答案 0 :(得分:5)
CPU具有数据总线和地址总线。可以具有相同的宽度,但它们通常不是。
堆栈指针是指向内存的指针,因此它通常与地址总线一样宽,除非内部使用某些(奇怪/模糊)转换。指令指针(指向当前指令)也是指向存储器的指针,如指针宽指针。
其他寄存器主要处理数据,因此具有与数据总线相同的尺寸。但像往常一样,也有例外。
举个旧榜样。 6502.一个8位cpu(8位数据总线,16位地址总线)。它具有(或多或少)通用寄存器X和Y,以及称为A的“累加器”。所有8位寄存器。存在堆栈指针和指令指针,堆栈指针具有8个显式位和8个隐式位(堆栈总是在相同的256字节区域中),因此堆栈指针寄存器具有8位,指令指针具有16位。 / p>
8086,具有16位数据总线和20位地址总线。一般寄存器在哪里8(和16位)。指令指针和堆栈指针所在的16位,但使用段寄存器(也是16位)来获得完整的20位地址。
答案 1 :(得分:4)
8位CPU,堆栈大小可以预期 为8位宽度
你可能会想到,但你会错的。堆栈的基本用途是存储和存储。检索返回地址,在8位处理器上,这些实际上是16位值。例如Z80指令:
PUSH HL
将16位值(两个8位寄存器H和L的内容)压入堆栈。没有Z80指令推送8位值。
答案 2 :(得分:1)
堆栈实际上只是一个概念,“堆栈宽度”并不意味着什么。
据推测,您的意思是堆栈元素的宽度,但您通常可以在任何堆栈上存储任意大小的值(使用一些填充或对齐),而不管架构的总线宽度或寄存器大小的大小。
请注意,术语8位,16位等有点随意,并且定义不是很严格,因此这使得“宽度”的任何尝试定义都变得复杂。
答案 3 :(得分:1)
尚未提及的一点是某些CPU(例如Microchip PIC系列)具有专用堆栈,该堆栈不像普通RAM那样被访问。在PIC16系列上,堆栈专门与程序计数器相连,堆栈(可能)与程序计数器的宽度相同。在PIC18系列中,堆栈和程序计数器都是21位宽;高20位可以复制到程序计数器或从程序计数器复制;代码还可以将顶部堆栈元素检查为5位部分和两个8位部分。