【问题标题】:what is the difference between ESP register and SS register?ESP寄存器和SS寄存器有什么区别?
【发布时间】:2012-01-28 09:25:54
【问题描述】:

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

【问题讨论】:

  • 您可能想了解memory segmentation
  • SS 与 32 位程序无关。它映射完整的 4 GB 虚拟内存空间,就像 DS 和 ES 一样。

标签: assembly x86 memory-segmentation stack-pointer


【解决方案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 寄存器。

【讨论】:

  • 当然,Hans Passant 写的是真的,而且你说的是 ESP 而不是 SP,你说的是 32 位的场景,所以你完全不用担心SS 寄存器。
  • 实际上,准确地说,它甚至可以在 32 位 CPU(但在 64 位)上使用,但是在任何现代操作系统中实际上都没有使用内存分段。
猜你喜欢
  • 2017-03-12
  • 2012-02-10
  • 1970-01-01
  • 1970-01-01
  • 2018-11-11
  • 2017-07-15
  • 2012-01-11
  • 2014-06-07
  • 2013-12-08
相关资源
最近更新 更多