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

ork*_*675 -2 c x86 assembly

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

ebp参考

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

fuz*_*fuz 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
Run Code Online (Sandbox Code Playgroud)