Зарегистрировать арифметику в сборке - PullRequest
1 голос
/ 01 апреля 2011

это мой первый раз здесь.

Я закончил читать PC Assembly Language, и я работал над реализацией шифрования RC4 в Assembly.Я не могу понять, почему

mov eax, [edx+ecx]

работает, а

mov eax, [edx-ecx]

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

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

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

Ответы [ 3 ]

4 голосов
/ 01 апреля 2011

Существует код операции для:

mov eax, [edx+ecx]

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

mov eax, [edx-CONSTANT]

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

mov eax, [edx+(-CONSTANT)]

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

mov eax, [edx-ecx]

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

3 голосов
/ 01 апреля 2011

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

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

0 голосов
/ 01 апреля 2011

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

...