ESP寄存器和SS寄存器有什么区别?

10

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


1
你可能想了解一下内存分段的相关知识。 - cnicutar
4
SS在32位程序中无关紧要。它映射整个4 GB的虚拟内存空间,与DS和ES一样。 - Hans Passant
1个回答

16

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寄存器。

1
当然,Hans Passant所写的是正确的,而且由于你谈论的是ESP而不仅仅是SP,你谈论的是32位场景,因此你根本不需要担心SS寄存器。 - Mike Nakis
3
实际上,准确地说,它甚至可以在32位CPU上使用(但在64位上),但在任何现代操作系统中,内存分段实际上都不被使用。 - Maarten

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接