Перейти к содержанию

FHell

Стажёры
  • Постов

    3
  • Зарегистрирован

  • Посещение

Сообщения, опубликованные FHell

  1. Цитата

    И да, кстати, что конкретно ты подразумеваешь под прямой и косвенной адресацией?

    Если левый операнд 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.

     

  2. Здравствуйте. Начну с примера

    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]" не верна.

×
×
  • Создать...

Важная информация

Находясь на нашем сайте, Вы автоматически соглашаетесь соблюдать наши Условия использования.