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

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

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

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

test.asm: 10: ошибка: Неподдерживаемое не 32-битное перемещение ELF

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

Ответ 1

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

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

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

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

пг. 4-320 Vol. 2B

Изменить

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

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

Глава 6.2

Ответ 2

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

Ответ 3

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

Ответ 4

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