8

我只是汇编语言的初学者。据我所知,ESP 和 SS 都指的是堆栈寄存器,但不太了解它们之间的区别。

4

1 回答 1

13

ESP寄存器是16位SP寄存器的32位版本,但在32位架构中,SS是无关紧要的。所以,让我们先谈谈16位。关于 32 位的说明在帖子末尾。

在 16 位 Intel x86 架构中:

  • SS是堆栈段寄存器。它标识将用于堆栈的内存块。

  • SP是堆栈指针寄存器。它指向堆栈段内的精确位置,该位置在任何给定时刻都是堆栈的“顶部”。


16 位 Intel 架构有一个笨拙的机制,通过 16 位“段”加上 16 位“偏移”来实现 20 位宽地址,因此SS寄存器将指向堆栈段,而SP寄存器将保存堆栈中的实际偏移量。我们会说当前堆栈位置在SS:SP.

自然,您可能想知道为什么它们只能有 20 位宽的地址而不是 32 位宽的地址,因为段寄存器是 16 位宽的,而偏移寄存器是另一个 16 位宽的。嗯,这就是架构笨拙的部分原因:由该SS:SP对表示的实际地址不是计算为(SS << 16) + SP,而是计算为(SS << 4) + SP。这意味着这些段具有非常高的重叠度:即使每个段的长度为 65536 字节,但它的开始距离前一个段的开始仅 16 字节。所以,segment:offset地址0:0代表绝对地址0,而1:0地址代表绝对地址16. (显然他们不相信任何人都需要处理超过 20 位的地址空间。)


32 位

在 32 位架构中,这些都不重要,因为ESP寄存器足够大,可以自己寻址整个 32 位内存地址空间,而不需要任何段寄存器。因此,如果您使用ESP收银机,则根本不必担心收银SS机。

于 2011-12-27T09:28:38.713 回答