Нельзя вычитать регистры в режиме адресации?

Я закончил читать язык ассемблера для ПК и работал над реализацией шифрования RC4 в ассемблере. Чего я не могу понять, так это почему

mov eax, [edx+ecx]

работает, но

mov eax, [edx-ecx]

нет. Встроенный ассемблер выдает мне это сообщение об ошибке,

непостоянное выражение во втором операнде

Что это значит? Заранее спасибо.


person shebaw    schedule 01.04.2011    source источник


Ответы (3)


Ниже приводится хороший обзор режимов адресации x86. Обратите внимание, что формы «регистрация минус регистрация» не существует: Википедия.

В качестве обходного пути вы можете отрицать содержимое ecx, а затем использовать [edx+ecx] (возможно, вам придется отменить его обратно, если впоследствии вам понадобится исходное значение).

person NPE    schedule 01.04.2011
comment
Или: mov eax,edx; sub eax, ecx, mov eax,[eax]. Это избавит вас от лишнего отрицания - person Ritsaert Hornstra; 01.04.2011

Есть опкод для:

mov eax, [edx+ecx]

и есть код операции, который можно собрать из:

mov eax, [edx-CONSTANT]

потому что ассемблер использует обычный код операции, но отрицает константу во время сборки:

mov eax, [edx+(-CONSTANT)]

Однако нет кода операции для:

mov eax, [edx-ecx]

Таким образом, вы пытаетесь выполнить несуществующую инструкцию.

person John Lemberger    schedule 01.04.2011

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

person Brian Knoblauch    schedule 01.04.2011