Сейчас на форуме: (+5 невидимых) |
eXeL@B —› Дневники и блоги —› Изучение ассемблерных команд |
Посл.ответ | Сообщение |
|
Создано: 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:
А теперь добавим перед BAh префикс 66h: Code:
Инструкция превратилась в 16 битную mov dx, 5678h а ее остаток стал самостоятельной инструкцией. Address-size override prefix (префикс переопределения размера адреса) Данный префикс имеет код 67h. Intel и AMD дружно говорят, что данный префикс изменяет дефолтный размер операнда, указывающего на память. Пример. Ассемблируем команду mov ebx, dword ptr [edi]: Code:
Добавляем к опкоду 8Bh префикс 67h: Code:
Правда тут еще и сам операнд изменился, это эффект перехода 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 |
|
Создано: 06 января 2011 18:09 · Личное сообщение · #2 |
|
Создано: 11 января 2011 23:24 · Личное сообщение · #3 |
eXeL@B —› Дневники и блоги —› Изучение ассемблерных команд |