mov dword[abc],xxx или mov [abc],dword xxx в fasm

Тема в разделе "WASM.ASSEMBLER", создана пользователем Microedition, 28 окт 2008.

  1. Microedition

    Microedition Active Member

    Публикаций:
    0
    Регистрация:
    5 июн 2008
    Сообщения:
    814
    Есть ли в этом разница? (см. заголовок)
     
  2. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.787
    Microedition
    Разницы нет. Скорее разница в синтаксисе разных ассемблеров так в masm если переменная abc описана как dword тогда размер не указывается mov abc,xxx а если вы обращаетесь к одной из частей abc тогда mov byte ptr abc+3,xxx
     
  3. nobodyzzz

    nobodyzzz New Member

    Публикаций:
    0
    Регистрация:
    13 июл 2005
    Сообщения:
    475
    разница в том что
    Код (Text):
    1. mov [abc],dword xxx
    не правильно =)))
     
  4. diamond

    diamond New Member

    Публикаций:
    0
    Регистрация:
    21 май 2004
    Сообщения:
    507
    Адрес:
    Russia
    Для mov разницы нет (если abc - переменная типа dword или не имеет своего типа, как в [eax]), но вот между
    Код (Text):
    1. add dword [abc],0
    2. add [abc],dword 0
    разница существенная - первая команда занимает три байта, вторая - шесть.
     
  5. Ra!N

    Ra!N New Member

    Публикаций:
    0
    Регистрация:
    26 окт 2006
    Сообщения:
    111
    1) только в 16-битном режиме
    2) про 3 байта ты наверно чтото путаешь - меньше 6 никак нельзя.

    А про
    Код (Text):
    1. add dword [abc],0
    2. add [abc],dword 0
    разница есть в машкоде. Но результат работы - один и тот же.
     
  6. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    Ra!N
    8 команд (основной код команды 0x80, 0x81, 0x82, 0x83, дополнительный код команды находится в поле reg байта MODRM) с непосредственным операндом имеют короткую форму, в которой непосредственный операнд расширяется (или не расширяется) со знаком до размера операнда получателся. Второй (начиная с единицы) бит в коде команды отвечает за размножение знака. 'add eax, 0x1', например, кодируется как '83 C0 01'.
     
  7. Ra!N

    Ra!N New Member

    Публикаций:
    0
    Регистрация:
    26 окт 2006
    Сообщения:
    111
    Mika0x65
    Вроде (я могу ошибаться) короткие формы существуют только при обращении к регистрам и то не ко всем (eax точно, остальные не знаю, например: "mov dword [eax],0" будет короткой), а с памятью вроде коротких нет. Можно пример 3-хбайтовой "add dword [mem],0"? (16 бит)
     
  8. diamond

    diamond New Member

    Публикаций:
    0
    Регистрация:
    21 май 2004
    Сообщения:
    507
    Адрес:
    Russia
    Раз речь идёт про dword, по умолчанию подразумевается 32-битный режим. В 16-битном режиме всюду добавляется префикс 66h, а кое-где и 67h.
    Имелось в виду сравнение двух команд - получается разница в 3 байта за счёт того, что в первом случае непосредственное значение 0 кодируется как байт, а во втором - как dword. Если abc = регистр, отличный от ebp и esp (типа add dword [eax],0), тогда действительно 3 байта против 6. Если abc = адрес переменной в памяти, то в обоих случаях добавляется 4 байта (2 в 16-битном режиме) на хранение этого адреса и получается 7 байт против 10.
     
  9. Phantom_84

    Phantom_84 New Member

    Публикаций:
    0
    Регистрация:
    6 июн 2007
    Сообщения:
    820
    Ra!N, речь идет о коротком и длинном непосредственных операндах в инструкциях, отличных от инструкции загрузки константы (mov reg/mem, CONST), например, add mem, SHORT CONST (-128...127) может занимать на 3 байта меньше, чем аналогичная add mem, CONST, где CONST не попадает в указанный диапазон.
     
  10. Phantom_84

    Phantom_84 New Member

    Публикаций:
    0
    Регистрация:
    6 июн 2007
    Сообщения:
    820
    ...Но ты, видимо, об этом не знал, потому что, например, add reg, SHORT CONST обычно занимает именно 3 байта!
     
  11. Phantom_84

    Phantom_84 New Member

    Публикаций:
    0
    Регистрация:
    6 июн 2007
    Сообщения:
    820
    ...Зы, а даймонд показал пример обращения к памяти с прямой адресацией, но говорил о 3 байтах, подразумевая обращение к регистрам или к памяти с использованием косвенной регистровой адресации без дополнительных смещений.
     
  12. Phantom_84

    Phantom_84 New Member

    Публикаций:
    0
    Регистрация:
    6 июн 2007
    Сообщения:
    820
    add [bx+si], 0 - 16-битный код, 3 байта
    add [ebx], 0 - 32-битный код, 3 байта