-
Постов
3 -
Зарегистрирован
-
Посещение
Тип контента
Профили
Форумы
Загрузки
Блоги
Сообщения, опубликованные FHell
-
-
Цитата
И да, кстати, что конкретно ты подразумеваешь под прямой и косвенной адресацией?
Если левый операнд edi - это
прямаярегистровая адресация, то [edi] - это косвенно-регистровая адресация.ЦитатаКак насчет решить проблему, почитав документацию к интересующей тебя инструкции ассемблера?
Rtfm это, безусловно, хороший совет. И я читал про команды ассемблера. Но я просто не понимаю некоторые описанные в ней моменты
Вот например вырезка с av-assembler:
СпойлерПри использовании этой команды следует учитывать, что имеются некоторые ограничения. А именно, инструкция MOV не может:
- Записывать данные в регистры CS и IP.
- Копировать данные из одного сегментного регистра в другой сегментный регистр (сначала нужно скопировать данные в регистр общего назначения).
- Копировать непосредственное значение в сегментный регистр (сначала нужно скопировать данные в регистр общего назначения).
ИСТОЧНИКОМ может быть один из следующих:
- Область памяти (MEM)
- Регистр общего назначения (REG)
- Непосредственное значение (например, число) (IMM)
- Сегментный регистр (SREG)
ПРИЁМНИКОМ может быть один из следующих:
- Область памяти (MEM)
- Регистр общего назначения (REG)
- Сегментный регистр (SREG)
С учётом ограничений, которые были описаны выше, комбинации ПРИЁМНИК-ИСТОЧНИК могут быть следующими:
REG, MEM SREG, MEM MEM, REG REG, REG SREG, REG MEM, IMM REG, IMM MEM, SREG REG, SREG
Пример использования инструкции MOV:
MOV AX, 0B800h ; установить AX = B800h (память VGA). MOV DS, AX ; копировать значение из AX в DS. MOV CL, 'A' ; CL = 41h (ASCII-код). MOV CH, 01001110b ; CH = атрибуты цвета (желтый текст на красном фоне). MOV BX, 72eh ; BX = позиция на экране = 2*(x + y*80). MOV [BX], CX ; [0B800h:015Eh] = CX.
По всей видимости, я упускаю какой-то важный момент. Если я думаю, что операция mov [edi], [edi+4] должна работать. Буду признателен, если вы меня "тыкните носом".
P.S. если и [edi], и [edi+4] это области памяти MEM, то почему я не могу сделать mov MEM, MEM.
-
Здравствуйте. Начну с примера
fstp dword ptr [edi] // По адресу [edi] лежит, скажем, current_float // Рядышком, в [edi+4] лежит maximum_float // Задача записать maximum_float вместо current_float // Как я вижу решение: fstp dword ptr [edi] mov [edi], [edi+4] // Конечно, это не работает и моя проблема заключается в том, что я не понимаю почему данная запись не верна. // Workaround1: fstp dword ptr [edi] push eax mov eax, [edi+4] mov [edi], eax pop eax // Workaroud2: fstp dword ptr [edi] fld dword ptr [edi+4] fstp dword ptr [edi]
Собственно вопрос, какое решение является лучшим и почему запись вида "mov [edi], [edi+4]" не верна.
Не могу до конца освоить прямую/косвенную адресацию.
in Cheat Engine
Опубликовано
Спасибо за ответы, пояснения и предоставленные аналогии) Всё понял, закрепил, усвоил.