因此%ebp(堆栈基指针)+常量用于引用程序集中的局部变量。如果有太多的局部变量并且所需的常量太大而不适合一行汇编代码(32或64位)怎么办?这样的边缘情况如何处理?
例如,在上面的图像中假设有2 ^ 30个局部变量。要引用最后一个,我们需要一个2 ^ 32的偏移量。如果我们在32位环境中工作,考虑到操作码,目的地等也在同一行中,这个偏移量不适合一行代码。
答案 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