太多局部变量和堆栈基指针偏移溢出

时间:2017-01-31 00:40:06

标签: c assembly x86

因此%ebp(堆栈基指针)+常量用于引用程序集中的局部变量。如果有太多的局部变量并且所需的常量太大而不适合一行汇编代码(32或64位)怎么办?这样的边缘情况如何处理?

ebp reference

例如,在上面的图像中假设有2 ^ 30个局部变量。要引用最后一个,我们需要一个2 ^ 32的偏移量。如果我们在32位环境中工作,考虑到操作码,目的地等也在同一行中,这个偏移量不适合一行代码。

1 个答案:

答案 0 :(得分:5)

在32位和64位操作模式下,x86架构寻址模式允许无位移,8位位移或32位位移。

在32位模式下,32位位移足以描述每个可能的位移(因此,每个可能的堆栈偏移)。出于您的考虑:堆栈不可能包含2个 30 变量,因为它们是4 GiB的堆栈空间,没有空间来存储机器代码。

在64位模式下,确实可能存在无法用32位位移描述的位移。这在现实中很少发生(这就是AMD工程师决定将位移大小保持在32位的原因)但偶尔会发生这种情况。在这种情况下,必须通过寄存器来应用位移:

mov rax,0x123456789abcdef0 ; displacement
mov eax,[rax,rbp]          ; value