Разница между (sp) и [sp] в сборке - PullRequest
1 голос
/ 07 января 2020

Я экспериментировал с ассемблером NASM, когда столкнулся с проблемой:

mov (sp),bx
mov [sp],bx

Первая инструкция собрана правильно, а вторая - нет, и выдает ошибку:

ошибка: неверный действующий адрес

Почему это так? Какая разница между ними?

1 Ответ

4 голосов
/ 07 января 2020

(%sp) будет режим адресации синтаксиса AT & T. (Недопустимо, потому что 16-битные режимы адресации не могут использовать SP напрямую, только BP|BX + SI|DI NASM x86 16-битные режимы адресации ; по этой же причине mov [sp], bx является недопустимым.)

В синтаксисе NASM квадратные скобки [] означают операнд памяти.


В NASM символы () вокруг SP удаляются, как и любое выражение времени компиляции,
, поэтому mov (sp), bx собирается в 89DC mov sp,bx. Попробуйте сами, собрав и используя ndisasm на выходе. (Или собрать в -felf32 и использовать objdump)

Это mov между двумя регистрами, перезаписывающий указатель стека. Скорее всего, не то, что вам нужно, и полностью отличается от хранения в памяти с mov [bp], bx или чем-то еще.

В NASM вы можете использовать парены при написании чего-то вроде mov ax, (1+3) * 4, так что анализатор выражений NASM обрабатывает парены, и, очевидно, наличие имени регистра в скобках ничего не меняет.

Я упомянул только синтаксис AT & T в верхней части этого ответа, потому что это и синтаксис Plan9 / Go - единственный раз, когда вы обычно ставите регистрационное имя внутри паренов; это просто сбивает с толку в синтаксисе NASM; не делай этого.

...