2017-01-31 12 views
-2

Таким образом,% ebp (указатель стека) + константа используется для ссылки на локальные переменные в сборке. Что делать, если слишком много локальных переменных, а требуемая константа - настолько большая, что она не соответствует одной строке кода сборки (32 или 64 бита)? Как обрабатываются такие краевые случаи?Слишком много локальных переменных и переполнение стека базового указателя

ebp reference

Например, в приведенном выше изображении предположим, что существует 2^30 локальных переменных. Чтобы ссылаться на последнее, нам понадобится смещение 2^32. Если мы работаем в 32-битной среде, это смещение не будет вписываться в одну строку кода, учитывая, что в этой же строке есть код операции, пункт назначения и т. Д.

+5

У вас не будет столько стопки в любом случае, чтобы вы могли дождаться его, переполнение стека! \ o/Но если у вас их достаточно, это просто обернется. – Jester

+2

Реалистично, что компилятор взорвется задолго до этого (так что у него никогда не будет возможности генерировать код asm, который бы имел эту проблему), так как AST и другие внутренние структуры данных будут еще больше. – harold

ответ

5

В режимах 32-разрядной и 64-разрядной операций режимы адресации архитектуры x86 допускают либо смещение, либо 8-разрядное смещение, либо 32-разрядное смещение.

В 32-битном режиме достаточно 32-битного смещения, чтобы описать все возможные перемещения (и, следовательно, все возможные смещения стека). Для вашего беспокойства: стек не мог содержать 2 переменных, так как это было бы 4 гигабайта пространства стека, не оставляя места для хранения машинного кода.

В режиме 64 бит действительно возможно иметь смещения, которые невозможно описать с 32-разрядным смещением. Это редко происходит на самом деле (поэтому инженеры AMD решили оставить размер смещения на 32 бит), но это может произойти изредка. В таких случаях перемещение должно быть подано через регистр:

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