Почему невозможно переместить байт в стек на Pentium IA-32? - PullRequest
12 голосов
/ 06 апреля 2010

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

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

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

test.asm: 10: error: неподдерживаемое перемещение не-32-битных ELF

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

Ответы [ 4 ]

10 голосов
/ 06 апреля 2010

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

4 голосов
/ 06 апреля 2010

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

Атрибут размера адреса сегмент стека определяет стек размер указателя (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 об. 2B

Редактировать

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

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

Глава 6.2

0 голосов
/ 06 апреля 2010

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

0 голосов
/ 06 апреля 2010

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

...