Сейчас на форуме: (+5 невидимых)

 eXeL@B —› Дневники и блоги —› Изучение ассемблерных команд
Посл.ответ Сообщение


Ранг: 793.4 (! !), 568thx
Активность: 0.740
Статус: Участник
Шаман

Создано: 17 ноября 2010 12:28 · Поправил: PE_Kill
· Личное сообщение · #1

Здесь я буду писать об ассемблерных командах, но не в плане их применения для написания программ, а в плане их идентификации в коде и понимания принципа их работы. Мануалы производителей процессоров зачастую весьма скудны (особенно у AMD). Поэтому буду добывать информацию везде и структурировать в этой теме.

Пока я буду разбираться с инструкциями режима 16/32 бит, и не трогаю режим 64 бит.

Начать хочу с префиксов ассемблерных команд.
Маны Intel'а говорят:
Префиксы инструкций делятся на четыре группы, каждая с набором допустимых кодов префикса. Для одной команды, может использоваться один префикс с каждой из четырех групп префиксов. Префиксы могут быть расположены в любом порядке.

Маны AMD говорят:
У инструкций могут быть наследуемые префиксы, имеющие уникальный код. Все наследуемые префиксы сгруппированы в пять групп. У инструкции может быть по одному префиксу из каждой группы. Располагаться они могут в любом порядке. Если у инструкции несколько префиксов из одной группы, то действие префиксов на инструкцию неизвестно.

Посмотрим как сгруппировали префиксы эти 2 вендора:
Intel:
Group 1 Lock and repeat prefixes (префиксы повтора и блокировки)
Group 2.1 Segment override prefixes (префиксы переопределения сегмента)
Group 2.2 Branch hints (префиксы подсказки ветвлений)
Group 3 Operand-size override prefix (префикс переопределения размера операнда)
Group 4 Address-size override prefix (префикс переопределения размера адреса)

AMD:
Group 1 Operand-Size Override prefix (префикс переопределения размера операнда)
Group 2 Address-size override prefix (префикс переопределения размера адреса)
Group 3 Segment override prefixes (префиксы переопределения сегмента)
Group 4 Lock prefix (префикс блокировки)
Group 5 Repeat prefixes (префиксы повтора)

Как видим у вендоров немного разные взгляды на группирование префиксов. При этом видно, что префиксы блокировки и повтора у одного вендора в одной группе, у второго в разных. И судя по рекомендациям использования у одного вендора можно использовать только блокировку или только повтор, у второго можно использовать и повтор и блокировку одновременно. Это либо неточность документации, либо такой набор префиксов действительно по разному себя ведет на разных процессорах, это нужно проверить.

Далее. В документации от Intel видно, что группа 2 имеет подгруппу Branch hints. В документации от AMD я вообще не нашел упоминания этих префиксов. Да и у Intel'а о них всего 2 слова. Чуть позже я дойду до них и распишу что это и для чего. А пока виден пробел в этом плане в документации AMD, т.к. эти префиксы он понимает и интерпретирует, но при этом не упоминает этот факт в документации.

Раз у вендоров группы немного отличаются, то мы будем рассматривать их так, чтобы не останавливаться на каждом вендоре отдельно, а изучить в общем.
Operand-Size Override prefix (префикс переопределения размера операнда)
Данный префикс имеет код 66h. Intel сухонько говорит, что данный префикс является переключателем между 16 и 32 битными режимами, а при использовании вместе со специальным опкодом 0Fh изменяет код операции, что используется в некоторых SIMD инструкциях. AMD тут более разговорчив. Данный префикс изменяет закодированный размер операнда, будь то размер памяти или размер регистра. При использовании данного префикса в 128 и 64 битных медиа инструкциях, данный префикс меняет не размер операнда, а сам опкод. Но при этом инструкции 3DNow! хоть и работают с 64 битами, но игнорируют данный префикс.

Для закрепления рассмотрим пример. Ассемблируем любым ассемблером команду mov edx, 12345678h:
Code:
  1. BA78563412 MOV EDX,12345678

А теперь добавим перед BAh префикс 66h:
Code:
  1.  >  66:BA 7856      MOV DX,5678
  2.     34 12           XOR AL,12

Инструкция превратилась в 16 битную mov dx, 5678h а ее остаток стал самостоятельной инструкцией.

Address-size override prefix (префикс переопределения размера адреса)
Данный префикс имеет код 67h. Intel и AMD дружно говорят, что данный префикс изменяет дефолтный размер операнда, указывающего на память.

Пример. Ассемблируем команду mov ebx, dword ptr [edi]:
Code:
  1. 8B1F MOV EBX,DWORD PTR DS:[EDI]

Добавляем к опкоду 8Bh префикс 67h:
Code:
  1. 678B1F MOV EBX,DWORD PTR DS:[BX]

Правда тут еще и сам операнд изменился, это эффект перехода 16 битному режиму, ну да ладно, эффект виден.

Lock prefix (префикс блокировки)
Данный префикс имеет код F0h. Префикс используется для монопольного доступа к общей памяти (ее чтение/изменение/запись) в инструкциях, работающих с памятью. При этом AMD уточняет, что префикс может использоваться только для следующих инструкций (при работе с памятью): ADC, ADD, AND, BTC, BTR, BTS, CMPXCHG, CMPXCHG8B, CMPXCHG16B, DEC, INC, NEG, NOT, OR, SBB, SUB, XADD, XCHG, и XOR. При использовании префикса в других инструкциях произойдет исключение invalid opcode.

На этом пока всё, утомила что то писанина, хотя написать есть что. Отдохну допишу....

-----
Yann Tiersen best and do not fuck




Ранг: 255.8 (наставник), 19thx
Активность: 0.150.01
Статус: Участник
vx

Создано: 06 января 2011 18:09
· Личное сообщение · #2

Дык все маны интеловские переведите на русский. Мб нубью чемто поможет



Ранг: 62.8 (постоянный), 11thx
Активность: 0.060
Статус: Участник

Создано: 11 января 2011 23:24
· Личное сообщение · #3

Clerk

ты суть пропустил - он сравнивает маны и вычленяет общую парадигму и специфику подхода каждого вендора


 eXeL@B —› Дневники и блоги —› Изучение ассемблерных команд
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати