我只是汇编语言的初学者。据我所知,ESP 和 SS 都指的是堆栈寄存器,但不太了解它们之间的区别。
1 回答
该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
机。