Выравнивание стека ассемблера (или лучше выровненный пример с PUSH) - PullRequest
4 голосов
/ 20 февраля 2010

Ну, во-первых, я понимаю (или думаю, что понимаю) проблемы неправильного выравнивания стека.

Но я знаю (как и определение), что перемещение 16-битного значения в 32-битный стек может привести к смещению стека.

Но что я не понимаю, так это то, как это могло произойти ... поскольку PUSH и POP проверяют флаг D в дескрипторе сегмента (то есть 1 увеличение / уменьшение 32 бита и 0 16 бит). *

Предположим, что D flag = 1, должен ли PUSH AX уменьшаться на 32 бита? так как я "пропускаю" 16 бит в стеке?

Я не уверен, что понимаю эту проблему

1 Ответ

3 голосов
/ 20 февраля 2010

Хотя и push, и pop проверяют D-бит в дескрипторе сегмента, чтобы определить размер операнда по умолчанию (т. Е. 16 или 32/64 бита), его можно переопределить с помощью переопределения размера операнда 0x66.

Если бит D равен 0, то:

ff /6 

помещает 16 бит в стек

и

66 ff /6 

выдвигает 32 бита (или 64, если это 64-битный сегмент).

Если бит D равен 1, то верно обратное.

В любом случае, ESP (или RSP или просто SP, в зависимости от размера адреса) увеличивается или уменьшается на 2 (для 16-битных операций), 4 (для 32-битных операций) или 8 ( для 64-битных операций).

...