我只是一个汇编语言的初学者。 据我所知,ESP和SS都是指向堆栈寄存器,但我不太理解它们之间的区别。
我只是一个汇编语言的初学者。 据我所知,ESP和SS都是指向堆栈寄存器,但我不太理解它们之间的区别。
ESP
寄存器是16位SP
寄存器的32位版本,但在32位架构中,SS
是无关紧要的。因此,让我们先谈论16位。有关32位的说明请参见本文结尾。
在16位Intel x86架构中:
SS
是堆栈段寄存器。它标识将用于堆栈的内存块。
SP
是堆栈指针寄存器。它指向堆栈段内在任何给定时刻处于“顶部”的确切位置。
16位Intel架构通过16位“段”和16位“偏移量”实现20位宽地址的机制很笨重,因此SS
寄存器将指向堆栈段,而SP
寄存器将保存堆栈中的实际偏移量。我们会说当前堆栈位置在SS:SP
。
SS:SP
寄存器对表示的实际地址并非计算为(SS << 16) + SP
,而是(SS << 4) + SP
。这意味着段之间有很高程度的重叠:即使每个段长65536字节,其起始点距离前一个段的起始点仅16字节。所以,segment:offset
地址0:0
表示绝对地址0
,而1:0
地址表示绝对地址16
。(显然,他们认为没有人需要访问超过20位的地址空间。)
ESP
寄存器足够大,可以单独访问整个32位内存地址空间,不需要任何段寄存器。因此,如果您正在使用ESP
寄存器,则根本不需要担心SS
寄存器。