Я приехал, чтобы узнать, что Вы не можете продвинуть байт непосредственно на стек Intel Pentium, кто-либо может объяснить это мне?
Причина, что мне дали, состоит в том, потому что регистр ESP адресуем словом (или, который является предположением в нашей модели), и это должно быть "даже адрес". Я предположил бы, что постепенное уменьшение значения некоторого 32-разрядного двоичного числа не смешает с выравниванием регистра, но по-видимому я не понимаю достаточно.
Я попробовал некоторые тесты NASM и подошел, что, если я объявляю переменную (дб укуса 123) и продвигаю его на стеке, особенно постепенно уменьшается 4 (указание, что он продвинул 32 бита?). Но, "укус байта нажатия" (извините для моего выбора имен переменной) приведет к доброй ошибке:
тест asm:10: ошибка: неподдерживаемое non-32-bit перемещение ELF
Любые слова мудрости значительно ценились бы в течение этого смутного времени. Я - первый студент года, очень жаль о моей наивности в любом из этого.
Он основан на том, как был создан стек:
Атрибут 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
Указатель стека должен быть (по некоторым причинам оптимизации) выровнен на 4B -> он должен делиться на четыре (и, следовательно, последние 2 бита должны быть нулевыми) .
вы хотите использовать коды операций поворота битов для поворота по каждой 32-битной ячейке памяти, помещая 8 бит в время в регистр, пока вы не вернетесь обратно в начальные битовые позиции. теперь у вас должно быть 4 8-битных числа, выстроенных бок о бок в вашем 32-битном регистре. теперь поместите это в стек, и все готово.
В некоторых случаях это приведет к тому, что указатель стека не сможет выполнять свою работу. например, допустим, у вас есть функция, которая помещает байт в стек, а затем вызывает другую функцию. Вызов завершится попыткой записать неверный адрес возврата в стек, что приведет к ошибке.