Почему не возможно продвинуть байт на стек на Pentium IA-32?

Я приехал, чтобы узнать, что Вы не можете продвинуть байт непосредственно на стек Intel Pentium, кто-либо может объяснить это мне?

Причина, что мне дали, состоит в том, потому что регистр ESP адресуем словом (или, который является предположением в нашей модели), и это должно быть "даже адрес". Я предположил бы, что постепенное уменьшение значения некоторого 32-разрядного двоичного числа не смешает с выравниванием регистра, но по-видимому я не понимаю достаточно.

Я попробовал некоторые тесты NASM и подошел, что, если я объявляю переменную (дб укуса 123) и продвигаю его на стеке, особенно постепенно уменьшается 4 (указание, что он продвинул 32 бита?). Но, "укус байта нажатия" (извините для моего выбора имен переменной) приведет к доброй ошибке:

тест asm:10: ошибка: неподдерживаемое non-32-bit перемещение ELF

Любые слова мудрости значительно ценились бы в течение этого смутного времени. Я - первый студент года, очень жаль о моей наивности в любом из этого.

14
задан Ciro Santilli 新疆改造中心法轮功六四事件 9 November 2015 в 13:47
поделиться

4 ответа

Он основан на том, как был создан стек:

Атрибут address-size Сегмент стека определяет стек размер указателя (16, 32 или 64 бита). Тем атрибут operand-size текущего Сегмент кода определяет сумму указатель стека декрементирован (2, 4 или 8 байт).

В не-64-разрядных режимах: если размер адреса и размера операнда Атрибуты: 32, 32-битный ESP регистр (указатель стека) увеличивается на 4. Если оба атрибута являются 16, 16-разрядный регистр SP (стек) указатель) увеличивается на 2.

Источник: http://www.intel.com/Assets/PDF/manual/253667.pdf

pg. 4-320 Vol. 2B

Edit

Просто хотел отметить, что интересным чтением является раздел о стеках в руководстве, он объяснит создание сегмента стека дальше.

http://www.intel.com/Assets/PDF/manual/253665.pdf

Глава 6.2

4
ответ дан 1 December 2019 в 14:21
поделиться

Указатель стека должен быть (по некоторым причинам оптимизации) выровнен на 4B -> он должен делиться на четыре (и, следовательно, последние 2 бита должны быть нулевыми) .

0
ответ дан 1 December 2019 в 14:21
поделиться

вы хотите использовать коды операций поворота битов для поворота по каждой 32-битной ячейке памяти, помещая 8 бит в время в регистр, пока вы не вернетесь обратно в начальные битовые позиции. теперь у вас должно быть 4 8-битных числа, выстроенных бок о бок в вашем 32-битном регистре. теперь поместите это в стек, и все готово.

0
ответ дан 1 December 2019 в 14:21
поделиться

В некоторых случаях это приведет к тому, что указатель стека не сможет выполнять свою работу. например, допустим, у вас есть функция, которая помещает байт в стек, а затем вызывает другую функцию. Вызов завершится попыткой записать неверный адрес возврата в стек, что приведет к ошибке.

10
ответ дан 1 December 2019 в 14:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: