8-900-374-94-44
[email protected]
Slide Image
Меню

Справочник ассемблер команды – Справочник команд | Asmworld

Содержание

Справочник команд | Asmworld

ADCСложение с учётом переноса.
ADDСложение.
ANDЛогическое И.
BSFПрямое сканирование битов.
BSRОбратное сканирование битов.
BTПроверка бита.
BTСПроверка и инверсия бита.
BTRПроверка и сброс бита.
BTSПроверка и установка бита.
CALLВызов процедуры или переключение задачи.
CBWПреобразование байта в слово.
CLCСброс флага переноса.
CLDСброс флага направления.
CLIСброс флага прерывания.
CMCИнверсия флага переноса.
CDQПреобразование двойного слова в учетверённое слово.
CMPСравнение.
CWDПреобразование слова в двойное слово.
CWDEПреобразование слова в двойное слово.
DECДекремент.
DIVДеление без знака.
IDIVДеление со знаком.
ENTERУстановка кадра стека.
IMULУмножение со знаком.
INCИнкремент.
J(COND)Условный переход.
JMPБезусловный переход.
LAHFЗагрузка младшего байта регистра флагов в AH.
LEAVEВосстановление кадра стека.
LOOPУправление циклом со счётчиком в регистре CX/ECX.
LOOPNZ/LOOPNEУправление циклом со счётчиком в регистре CX/ECX.
LOOPZ/LOOPEУправление циклом со счётчиком в регистре CX/ECX.
MOVКопирование.
MOVSXКопирование со знаковым расширением.
MOVZXКопирование с нулевым расширением.
MULУмножение без знака.
NEGИзменение знака.
NOPНет операции.
NOTИнверсия.
ORЛогическое ИЛИ.
POPИзвлечение из стека.
POPA/POPADВосстановление регистров общего назначения из стека.
POPF/POPFDИзвлечение регистра флагов из стека.
PUSHПомещение в стек.
PUSHA/PUSHADПомещение регистров общего назначения в стек.
PUSHF/PUSHFDПомещение регистра флагов в стек.
RCLЦиклический сдвиг влево через флаг переноса.
RCRЦиклический сдвиг вправо через флаг переноса.
RET/RETN/RETFВозврат из процедуры.
ROLЦиклический сдвиг влево.
RORЦиклический сдвиг вправо.
SAHFЗапись содержимого AH в младший байт регистра флагов.
SALАрифметический сдвиг влево.
SARАрифметический сдвиг вправо.
SBBВычитание с заёмом.
SHLЛогический сдвиг влево.
SHLDСдвиг двойной точности влево.
SHRЛогический сдвиг вправо.
SHRDСдвиг двойной точности вправо.
STCУстановка флага переноса.
STDУстановка флага направления.
STIУстановка флага прерывания.
SUBВычитание.
TESTЛогическое сравнение.
XCHGОбмен.
XORЛогическое исключающее ИЛИ.

asmworld.ru

справочник | Asmworld

Автор: xrnd | Рубрика: Книги | 22-10-2010

Полное название: «Intel Architecture Software Developer’s Manual. Volume 2: Instruction Set Reference»

Язык: английский.

Эта книга — официальная документация компании Intel по системе команд архитектуры x86. В ней содержится подробное описание всех целочисленных команд 32-битного ассемблера, а также команд некоторых расширений процессора. Кроме того рассматривается формат машинных команд и их коды. Это лучший справочник, которой должен быть всегда под рукой. Рекомендую всем, кто программирует на ассемблере.

Книга на английском языке и, насколько я знаю, на русский она не переводилась. Но чтобы пользоваться ею, серьезного знания английского не требуется. Описание каждой команды включает в себя алгоритм её работы на псевдоязыке, который понятен без перевода.

Скачать книгу

Автор: xrnd | Рубрика: Новости | 13-05-2010

Добавил на сайт справочник по FASM. Спасибо, RoverWWWorm. Как я понял, это перевод официального мануала к FASM, который идёт вместе с компилятором. Единственное что, в справочнике описывается версия FASM 1.64. Возможно, какие-то директивы были добавлены или изменены в более новых версиях. Поэтому в случае сомнений обязательно сверяйтесь со свежим мануалом на английском 🙂

Скачать справочник можно в разделе «Файлы».

Автор: xrnd | Рубрика: Новости | 28-04-2010

Откопал у себя на диске древний справочник по функциям DOS, BIOS и аппаратным ресурсам. Он может быть полезен в дополнение к учебному курсу. В нём вы найдёте подробное описание функций операционной системы MS-DOS, функций BIOS, разных областей памяти и т.д. Почитайте, кому интересно.

Скачать справочник можно на странице «Файлы».

Автор: xrnd | Рубрика: Новости | 04-02-2010

На сайте появился новый раздел — «Справочник команд». Туда я буду добавлять описание команд архитектуры x86. Сразу все команды мне добавлять лениво, поэтому я буду делать это по мере написания статей учебного курса 🙂 Как только расскажу о новых командах — добавлю их описание. Так постепенно получится полный справочник.

Сейчас там уже есть описания 3-х команд, о которых я рассказывал в статье «Первая программа»: MOV, INC и NOP. Учтите, что в учебном курсе мы пока программируем под DOS и поэтому нам ещё не все регистры и команды доступны. Если есть идеи и предложения по справочнику, пишите в комментариях к этому посту.

asmworld.ru

FE23 — Справочник x86 — Команды ассемблера и машинные команды

 


Первоначально эта информация была помещена на странице   Пояснения к основным таблицам.   Но затем было решено, что эти длинные общие рассуждения лучше вынести на отдельную страницу. Однако, после такого переноса эти рассуждения еще немножко выросли. Теперь, пожалуй, они годятся только для раздела «Разные заметки» …

Команды ассемблера и машинные команды

Прежде всего нужно не забывать, что команды на языке ассемблера и команды на машинном языке — это две разные вещи. Хотя несомненно, что эти два понятия тесно связаны между собой.

Команда ассемблера это некоторое мнемоническое имя. Для процессоров семейства x86 это имя записывается на английском языке. Например, у команды сложения имя ADD, а у команды вычитания имя SUB.

В таблицах настоящего справочника в колонке Команда показано имя команды на языке ассемблера.

Основой машинной команды является код операции, который является просто некоторым числом. Для процессоров x86 (впрочем, и для других процессоров тоже) принято использовать шестнадцатиричные числа. (Попутно заметим, что для советских ЭЦВМ были приняты восьмеричные числа, с ними было меньше путаницы, поскольку такие числа состоят только из цифр и не содержат букв).

В таблицах настоящего справочника в колонке Код показан код операции машинной команды, а в колонке Формат показан формат машинной команды.

Можно считать, что количество разных машинных команд у данного процессора равно количеству возможных кодов операции. По формату можно узнать, из каких составных частей состоит данная машинная команда. Разные машинные команды могут иметь разный формат. Код операции машинной команды полностью определяет ее формат.


Часто одна ассемблерная команда имеет несколько разных вариантов машинных команд. Причем форматы этих машинных команд могут быть разными для разных вариантов.

Например, ассемблерная команда ADD имеет десять вариантов машинных команд с разными кодами операций. Но разных форматов оказывается меньше, только три. И каждый из этих трех форматов требует свои типы операндов при записи команды на языке ассемблера.

См. страницу   Основные команды арифметики.  

Здесь важно обратить внимание, что все эти десять машинных команд выполняют одну и ту же элементарную операцию, которая на языке ассемблера называется ADD.

И, значит, получается, что вроде бы можно рассуждать так: процессор может выполнять столько разных элементарных операций, сколько есть разных команд ассемблера. Однако, этот простой принцип все равно нуждается в оговорках и примечаниях. Так как у части ассемблерных команд бывают еще и синонимы.


Общий список всех команд процессора можно построить разными способами, выбирая разный порядок расположения команд. Основные два способа такие.

Способ (1). Взять за основу команды языка ассемблера и расположить команды по алфавиту. Тогда могут получиться вот такие таблицы.

 
Все команды по алфавиту (кратко)
Все команды по алфавиту (подробно)

Способ (2). Взять за основу код операции машинной команды и расположить команды в порядке кодов операций. При этом будет лучше, если общий список разделить на две части, сделать отдельные списки для команд с однобайтным кодом операции и для команд с двухбайтным кодом операции.

 
Первый байт кода операций
Второй байт кода операций

Конечно, возможен еще и третий способ, который обычно применяется в учебниках. Разделить все команды на группы по смыслу и изучать их по группам, начиная с более простых.

Основной байт кода операции

В системе команд x86 одного байта (256 разных комбинаций) оказалось недостаточно для кодирования всех команд. Поэтому код операции в машинной команде занимает либо один байт, либо два байта.

Если первый байт содержит код 0F, то код операции состоит из двух байтов.

Если в машинной команде код операции состоит из одного байта, то этот единственный байт и является основным байтом кода операции. И содержимое этого байта определяет, что это за операция.

Если в машинной команде код операции состоит из двух байт, то уже не первый, а второй байт будет основным и определяющим в коде операции.

В таблицах справочника, в которых показано кодирование машинных команд, основной байт кода операции обычно бывает показан дважды, сначала в колонке «Код» в виде шестнадцатиричного числа, а затем в колонке «Формат» в виде условных восьми черточек, на которых отмечены особые биты, если таковые есть в основном байте кода операции.




Основные страницы справочника

Справочник по командам процессоров x86 — главная страница
      (здесь карта всех страниц справочника)
 
Структура машинной команды
Байты MRM и SIB — формы адресации
 
Все команды по алфавиту (кратко)
Все команды по алфавиту (подробно)
Первый байт кода операций
Второй байт кода операций
 

looch-disasm.narod.ru

Тема 6. Основные команды языка Ассемблер

Напомним, что любая программа на ассемблере состоит из строк, в строке может быть одна команда для микропроцессора, или одна директива для трансляторов. Программа на языке ASM— это текстовым файлом с расширением ASM. Команда на языке ASM имеет формат:

<метка>: <мнемокод операции> <A1>, <A2>; <комментарий>

Метка-имя команды, присвоенное программистом, для ссылок на эту команду в других командах; метка не может начинаться с цифры.

Пример: pauza-1:> <MOV> <AL,[BX]>

Мнемокод операции – это зарезервированное ассемблером слово из 3,5 букв, обозначающее некоторую операцию.

Пример: MOV – мнемокод, операнд берется из памяти и куда-либо перемещается.

Адреса операндов– в нем указывается место положения операндов, на основе выбранных программистом способов адресации для каждого операнда раздельно.

Комментарий– любой текст на любом языке. Комментарий необходим пользователю в качестве пояснений, он может начинаться в любой позиции и занимать несколько строк.

Пример:

m1: mov al,[bx] ;процессор читает байт из сегмента данных по адресу

;смещения, хранящемуся в [bx], в свой регистр al.

m2: mov ax,[bx]+10 ;загружаем в регистр ax 10-й по счету байт по адресу

;смещения

При изучении команд следует учитывать допустимые для команды

  • форматы операндов;

  • местоположение и способы адресации операндов и результатов;

  • воздействие команды на флаги.

6.1. Команды пересылки.

Команды не изменяют флаги, формат операнда — байт или слово, приемник не может адресоваться непосредственно (т.е. не может быть константой).

1) Пересылка данных

Формат команды: MOV <приемник >,<источник>

Примеры: MOV AX, BX

MOV [BP], Bute ptr 25 ;в сегмент стека записать константу 25

2) Пересылка адресов

Формат команды:

LEA <16-битовый регистр>, <имя переменной>

Действие: адрес смещения переменной, хранимой в памяти, загружается в регистр МП (кроме сегментных регистров).

Пример:

LEA SI, tabl ;адрес смещения переменной table, хранимой в памяти,

;загружается в регистр (см. рис. 6.1).

Рис. 6.1.

Команда MOV SI,offset table выполняется аналогично.

3) Команды ввода/вывода(пересылки в порт)

а) Ввод из порта. Формат команды:

IN<регистр А>,<адрес порта>

б) Вывод в порт. Формат команды:

OUT<адрес порта>,<регистр А>

4) Пересылка в стек и из стека

Стек – память, организованная определенным образом.

а) Пересылка в стек. Формат команды:

PUSH <источник>

б) Пересылка из стека. Формат команды:

POP <приемник>

Команды PUSH и POP работают с ячейками стека, неявно адресуя через SS:SP.

PUSH AX

PUSH [BX]

PUSH DS

Обе команды работают со словом, т.е. нельзя поместиь в стек или извлечь из него одиночный байт. При выполнении PUSH вначале уменьшается на 2 содержимое указателя SP, а затем операнд помещается по адресу SS:SP. При извлечении из стека сначала читается память по адресу SS:SP, а затем SP увеличивается на 2. Таким образом, при заполнении указатель вершины стека SP смещается к младшим адресам, а при освобождении – к старшим. Нужно помнить, что при выходе из подпрограммы указатель SP должен содержать то же смещение, что и при входе в нее, т.е. подпрограмма не должна забыть в стеке лишнее слово или взять больше нужного.

studfiles.net

5. Основные группы команд ассемблера

5. Основные группы команд ассемблера.

1. Команды передачи данных

dst – получатель

src – источник

mem адрес памяти

reg – регистр процессора

sreg – сегментный регистр

data – непосредственные данные

MOV – команда пересылки данных (копирование)

  1. одним из операндов должен бать обязательно регистр

  2. нельзя пересылать из одной ячейки памяти в другую

  3. нельзя содержимое одного сегментного регистра переслать в другой сегментный регистр (нужно использовать РОНы или STACK)

  4. нельзя использовать сегментный регистр CS в качестве приемника (потеряются коды)

  5. ОПЕРАНДЫ ДОЛЖНЫ СОАПАДАТЬ ПО ДЛИНЕ

Команды ввода/вывода из портов: IN AL,42H

OUT AX,71H

  1. LEA AX,mem (аналогично mov AX,OFFSET(mem))

  2. Push, Pop

2. Команды арифметической обработки целых чисел.

1) Команды сложения:

а) ADD – сложение mem/reg1, reg2/mem (1_операнд+2_операнд=1_операнд)

dst:=dst+src;

б) INC – увеличение на 1

2) Команды вычитания:

а) DEC – уменьшение на 1

б) SUB dst,src (dst:=dst-src)

в) SBB dst,src – вычитание с переносом

г) NEG – изменяет знак на противоположный

3) Команды сравнения:

а) CMP dst,src

б) SUB dst,src (сравнение осуществляется путем вычитания источника из приемника (воздействует на флаги: CF, OF, SF, ZF, AF, PF)

4) Умножние:

а) MUL src – команда умножения для беззнаковых чисел (выполняет умножение операнда на регистр AX)

б) IMUL src – для знаковых чисел (результат может изменять знаки)

5) Деление:

а) DIV <делитель> (делимое должно находиться в AX!; частное попадает в AL, а остаток в AH)

б) IDIV – деление со знаком (целочисленное)

3. Логические операции (выполняются побитно).

AND, OR, XOR, NOT, TEST dst,src

X

Y

AND

OR

XOR

NOT x

0

0

0

0

0

1

0

1

0

1

1

1

1

0

0

1

1

0

1

1

1

1

0

0

NOT x не воздействует на флаги! Остальные команды воздействуют на OF, SF, ZF, PF, CF.

4. Сдвиговые операции.

Сдвиговые операции воздействуют на флаги: OF, SF, ZF, PF, CF

1) Простые:

а) SHL/SAL – сдвиг влево

б) SHR/SAH – сдвиг вправо

2) Циклические:

а) ROL/RCL – сдвиг влево

б) ROR/RCR – сдвиг вправо

5. Команды передачи управления.

1) Команды переходов:

1.1) безусловных переходов (JMP):

а) ближний переход

б) дальний переход (по адресу)

1.2) условных переходов (около 30)

1.3) для работы с беззнаковыми числами: JA/JNB/JNC

1.4) для работы со знаковыми числами: JG/JNLE; JS…

1.5) для всех: JE/JZ; JNP/JPO… и др.

Расшифровка команд перехода:

А (Above) – выше (для чисел без знака)

B (Below) – ниже, меньше (без знака)

L (Less) – меньше (для знаковых)

G (Greater) – больше (для знаковых)

N (Not) – не отрицания

E (Equal) – равно

Z (Zero) – 0

2) Команды вызова подпрограмм:

2.1) CALL<имя, адрес…> передает управления с автоматическим

сохранением адреса в STACK.

2.2) RET – всегда возврат в основную программу

(RET2) – возврат из подпрограммы и считывается из STACK 2-а слова.

3) Команды прерываний (INT)

INT<номер прерывания>

INT выполняется следующим образом:

  1. Декремент (уменьшение) указателя STACK на 2.

  2. Включение в STACK содержимого регистров флага (запомнить).

  3. Сброс флагов IF и TF (прерывание разрешаем).

  4. Декремент указателя STACK на 2.

  5. Сохраняем CS в STACK.

  6. Определение адреса вектора прерывания (умножение на 4)

  7. Загрузка в CS слова памяти, расположенного по адресу +2

  8. Декремент STACK на 2

  9. IP сохранить в STACK

10) Загрузка в IP слова памяти, расположенного по адресу (call<адрес>)

IRET – вернуться из прерывания (предназначена для выхода из подпрограммы обработки прерываний).

4) Команды управления флагами.

Push F – запомнить все флаги в стеке

Pop F – достать флаги из стека

FLD – команда пересылки флагов

5) Команды управления процессором.

HLT – приостанавливает работу ПК до RESET

WAIT – синхронизация основного процессора с сопроцессорами

ESC – выход

LOCK – запрещает обращение к шине на время выполнения программ.

6) Команды организации циклов.

LOOP – проверяет завершение цикла

LOOPE/LOOPZ – (если CX=0 или ZF=0)

LOOPNE/LOOPNZ – (если CX=0 или ZF=1)

JCXZ – (если CX=0, то переход к метке).

7) Цепочные команды.

Под цепочкой понимается последовательность любых контекстной связи байт или слов, находящихся в смежных ячейках памяти.

REP, LOOP, либо использовать проверку флагов: DF и DI, SI.

studfiles.net

Язык ассемблер. Команды и основы ассемблера

В статье будут рассмотрены основы языка ассемблер применительно к архитектуре win32. Он представляет собой символическую запись машинных кодов. В любой электронно-вычислительной машине самым низким уровнем является аппаратный. Здесь управление процессами происходит командами или инструкциями на машинном языке. Именно в этой области ассемблеру предназначено работать.

Программирование на ассемблер

Написание программы на ассемблере — крайне трудный и затратный процесс. Чтобы создать эффективный алгоритм, необходимо глубокое понимание работы ЭВМ, знание деталей команд, а также повышенное внимание и аккуратность. Эффективность — это критический параметр для программирования на ассемблер.

Главное преимущество языка ассемблер в том, что он позволяет создавать краткие и быстрые программы. Поэтому используется, как правило, для решения узкоспециализированных задач. Необходим код, работающий эффективно с аппаратными компонентами, или нужна программа, требовательная к памяти или времени выполнения.

Регистры

Регистрами в языке ассемблер называют ячейки памяти, расположенные непосредственно на кристалле с АЛУ (процессор). Особенностью этого типа памяти является скорость обращения к ней, которая значительно быстрее оперативной памяти ЭВМ. Она также называется сверхбыстрой оперативной памятью (СОЗУ или SRAM).

Существуют следующие виды регистров:

  1. Регистры общего назначения (РОН).
  2. Флаги.
  3. Указатель команд.
  4. Регистры сегментов.

Есть 8 регистров общего назначения, каждый размером в 32 бита.

Доступ к регистрам EAX, ECX, EDX, EBX может осуществляться в 32-битовом режиме, 16-битовом — AX, BX, CX, DX, а также 8-битовом — AH и AL, BH и BL и т. д.

Буква «E» в названиях регистров означает Extended (расширенный). Сами имена же связаны с их названиями на английском:

  • Accumulator register (AX) — для арифметических операций.
  • Counter register (CX) — для сдвигов и циклов.
  • Data register (DX) — для арифметических операций и операций ввода/вывода.
  • Base register (BX) — для указателя на данные.
  • Stack Pointer register (SP) — для указателя вершины стека.
  • Stack Base Pointer register (BP) — для индикатора основания стека.
  • Source Index register (SI) — для указателя отправителя (источника).
  • Destination Index register (DI) — для получателя.

Специализация РОН языка ассемблер является условной. Их можно использовать в любых операциях. Однако некоторые команды способны применять только определенные регистры. Например, команды цикла используют ESX для хранения значения счетчика.

Регистр флагов. Под этим подразумевается байт, который может принимать значения 0 и 1. Совокупность всех флагов (их порядка 30) показывают состояние процессора. Примеры флагов: Carry Flag (CF) — Флаг переноса, Overflow Flag (OF) — переполнения, Nested Flag (NT) — флаг вложенности задач и многие другие. Флаги делятся на 3 группы: состояние, управление и системные.

Указатель команд (EIP — Instruction Pointer). Данный регистр содержит адрес инструкции, которая должна быть выполнена следующей, если нет иных условий.

Регистры сегментов (CS, DS, SS, ES, FS, GS). Их наличие в ассемблере продиктовано особым управлением оперативной памятью, чтобы увеличить ее использование в программах. Благодаря им можно было управлять памятью размером до 4 Гб. В архитектуре Win32 необходимость в сегментах отпала, но названия регистров сохранились и используются по-другому.

Стек

Это область памяти, выделенная для работы процедур. Особенность стека заключается в том, что последние данные, записанные в него, доступны для чтения первыми. Или иными словами: первые записи стека извлекаются последними. Представить этот процесс себе можно в качестве башни из шашек. Чтобы достать шашку (нижнюю шашку в основание башни или любую в середине) нужно сначала снять все, которые лежат сверху. И, соответственно, последняя положенная на башню шашка, при разборе башни снимается первой. Такой принцип организации памяти и работы с ней продиктован ее экономией. Стек постоянно очищается и в каждый момент времени одна процедура использует его.

Идентификаторы, целые числа, символы, комментарии, эквивалентность

Идентификатор в языке программирования ассемблер имеет такой же смысл, как и в любом другом. Допускается использование латинских букв, цифр и символов «_», «.», «?», «@», «$». При этом прописные и строчные буквы эквивалентны, а точка может быть только первым символом идентификатора.

Целые числа в ассемблере можно указывать в системах отсчета с основаниями 2, 8, 10 и 16. Любая другая запись чисел будет рассматриваться компилятором ассемблера в качестве идентификатора.

В записи символьных данных допускается использовать как апострофы, так и кавычки. Если в символьной строке требуется указать один из них, то правила следующие:

  • в строке, заключенной в апострофы, кавычки указываются один раз, апостроф — дважды: ‘can»t’, ‘ he said «to be or not to be» ‘;
  • для строки, заключенной в кавычки, правило обратное: дублируются кавычки, апострофы указываются как есть: «couldn’t», » My favourite bar is «»Black Cat»» «.

Для указания комментирования в языке ассемблер используется символ точка с запятой — «;». Допустимо использовать комментарии как в начале строк, так и после команды. Заканчивается комментарий переводом строки.

Директива эквивалентности используется схожим образом тому, как в других языках указывают константные выражения. Эквивалентность указывается следующим способом:

 EQU 

Таким образом в программе все вхождения будут заменяться на , на месте которого допустимо указывать целое число, адрес, строку или другое имя. Директива EQU похожа по своей работе на #define в языке С++.

Директивы данных

Языки высокого уровня (C++, Pascal) являются типизированными. То есть, в них используются данные, имеющие определенный тип, имеются функции их обработки и т. д. В языке программирования ассемблер подобного нет. Существует всего 5 директив для определения данных:

  1. DB — Byte: выделить 1 байт под переменную.
  2. DW — Word: выделить 2 байта.
  3. DD — Double word: выделить 4 байта.
  4. DQ — Quad word: выделить 8 байтов.
  5. DT — Ten bytes: выделить 10 байтов под переменную.

Буква D означает Define.

Любая директива может быть использована для объявления любых данных и массивов. Однако для строк рекомендуется использовать DB.

Синтаксис:

 DQ [, ]

В качестве операнда допустимо использовать числа, символы и знак вопрос — «?», обозначающий переменную без инициализации. Рассмотрим примеры:

real1	DD	12.34
char 	db 	'c'
ar2 	db 	'123456',0	; массив из 7 байт
num1 	db 	11001001b	; двоичное число
num2 	dw 	7777o		; восьмеричное число
num3 	dd 	-890d		; десятичное число
num4 	dd 	0beah		; шестнадцатеричное число
var1 	dd 	?		; переменная без начального значения
ar3 	dd 	50 dup (0)	; массив из 50 инициализированных эл-тов
ar4 	dq 	5 dup (0, 1, 1.25)	; массив из 15 эл-тов, инициализированный повторами 0, 1 и 1.25

Команды (инструкции)

Синтаксис команд ассемблера или инструкций ассемблера выглядит следующим образом:

: 	[;Comment]

Метка (label:) обязательно завершается двоеточием и может располагаться в отдельной строке. Метки используются для того, чтобы ссылаться на команды внутри программы.

Инструкции указывают операцию, которая должна быть выполнена. В ассемблере операции представлены в виде буквенных сокращений для облегчения понимания. Инструкции также могут называться мнемокодами.

В роли операндов команды могут выступать:

  • регистры, обращение к которым происходит по их именам;
  • константы;
  • адреса.

Подробнее об адресах

Адрес может передаваться несколькими способами:

  1. В виде имени переменной, которая в ассемблере является синонимом адреса.
  2. Если переменная является массивом, то обращение к элементу массива происходит через имя его переменной и смещения. Для этого существует 2 формы: [ + ] и []. Следует учитывать, что смещение — это не индекс в массиве, а размер в байтах. Программисту самому необходимо понимать, на сколько нужно сделать смещение в байтах, чтобы получить нужный элемент массива.
  3. Можно использовать регистры. Для обращения к памяти, в которой хранится регистр, нужно использовать квадратные скобки: [ebx], [edi].
  4. [] — квадратные скобки допускают применение сложных выражений внутри себя для вычисления адреса: [esi + 2*eax].

В ассемблере адрес передается через квадратные скобки. Ввиду того, что переменная является также адресом, она может использоваться как с квадратными скобками, так и без.

Помимо этого, в ассемблер существуют сокращения: r — для регистров, m — для памяти и i — для операнда. Эти сокращения используются с числами 8, 16 и 32 для указания размера операнда: r8, m16, i32 и т. д.

add i8/i16/i32, m8/m16/m32 ;суммирование операнда с ячейкой памяти

Команда mov или пересылка

Данная инструкция является основной среди команд ассемблера. Она позволяет записывать в регистр значение другого регистра, ячейки памяти или константы. Она же осуществляет запись в ячейку памяти значения регистра или константы. Синтаксис команды:

MOV , 

В процессоре существует и другие команды для реализации пересылки. Например, XCHG — команда обмена операндов значениями. Но с точки зрения программиста, все они реализованы через команду базовую MOV. Рассмотрим примеры:

MOV i, 0 ; Записать в i значение 0
MOV ECX, EBX ; Пересылка значения EBX в ECX

В виде операнда может выступать как регистр, так и ячейка памяти. Однако если содержимое двух регистров можно переставить, то двух ячеек памяти — нет. Следует внимательно следить за тем, чтобы операнды имели одинаковый размер. Также заметим, что команда MOV не изменяет значения флагов.

Инструментарий

Дальнейшее теоретическое изучение ассемблера может быть трудным, поэтому стоит задуматься об инструментах, используемых для разработки программ с его помощью. Здесь будет приведен лишь краткий список популярных средств:

  • Borland Turbo Assembler (TASM) — один из самых популярных инструментов. Хорошо подходит для разработки под DOS и плохо — под Windows.
  • Microsoft Macro Assembler (MASM) — это пакет для разработки на ассемблере в среде Windows. Существует как отдельно, так и в виде встроенной функции в среде Visual Studio. Ассемблер и языки высокого уровня часто совместимы. В том смысле, что последние могут использовать ассемблер напрямую. Например, С++.
  • Netwide Assembler (NASM) — популярный свободный ассемблер для архитектуры Intel.

Существует множество инструментов. При этом следует сделать особую пометку о том, что нет единого стандарта синтаксиса ассемблера. Есть 2 наиболее применимых: AT&T-синтаксис, ориентированный на процессоры производства не Intel, и, соответственно, Intel-синтаксис.

Несмотря на кажущуюся сложность, ассемблер является простым языком программирования, понять который не составляет труда. Поэтому можно смело использовать учебную литературу на подобии «ассемблер для чайников» и изучать этот замечательный язык.

www.nastroy.net

FE23 — Справочник по командам процессоров x86

 

ГЛАВНАЯ СТРАНИЦА


Содержание


Об этом справочнике

Справочник по командам процессоров x86 дает хорошее обзорное представление по основным командам этого семейства процессоров.

Обычно подобные справочники позволяют рассматривать систему команд процессора только со стороны языка ассемблера. Данный справочник позволяет увидеть команды с двух сторон, как со стороны языка ассемблера, так и со стороны машинных кодов.

На сайте, посвященном программе FE23 Looch Disasm, данный справочник помещен в качестве приложения. Материалы для такого справочника с неизбежностью должны были появиться при разработке дизассемблера для программы FE23. И оставалось лишь аккуратно все оформить.

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


Приветствуются любые отзывы и замечания по справочнику

Мой адрес электронной почты:

looch-disasm ( @ ) ya.ru

Евгений
Москва


Все страницы справочника

Сейчас на справочнике всего есть 30 страниц (больших и маленьких).

Главная страница

Справочник по командам процессоров x86

Основные большие таблицы

Все команды по алфавиту (кратко)
Все команды по алфавиту (подробно)
Первый байт кода операций
Второй байт кода операций
 
Пояснения к основным таблицам

Структура машинной команды

Структура машинной команды
Байты MRM и SIB — формы адресации
 
Все коды байта MRM (16 бит)
Все коды байта MRM (32 бит)
Все коды байта SIB

Команды по группам

Основная арифметика
Инкремент и декремент
Пересылка данных
Работа со стеком
 
Условные команды
Переходы и процедуры
 
Умножение и деление
Команды сдвига
Цепочечные команды
Работа с битами
 
Десятичная арифметика
Установка флажков
Сегментные регистры
Специальные команды
 
Системные команды
Привилегированные
Вызов прерывания

Разные заметки

Регистры общего назначения
Коды сегментных регистров
 
Команды ассемблера и машинные команды
Группа команд 80, 81, 82, 83
Команды сравнения кодов
 

Последнее обновление справочника

25.07.2011

Уже давно приготовлены основные таблицы справочника. Можно сказать, что с этих больших страниц и начинался весь справочник.

В таблицы справочника были внесены все команды процессора i486.

Затем все команды были разбиты на несколько групп, по каждой из групп должна быть своя страница. Однако, пока не все из этих страниц готовы. Некоторые из них сделаны формально. Страница якобы присутствует, но на странице есть только начало. Так пришлось сделать, чтобы в основных таблицах можно было поставить ссылку на каждую группу.

И есть еще новые идеи. На сегодня сделаны еще не все страницы справочника, которые задуманы. Так что развитие справочника еще не закончилось, будут еще новые страницы.

Добавлены страницы по структуре машинной команды и большие таблицы с кодами байта MRM и байта SIB. Вроде бы придуман неплохой способ, как сделать таблицы со всеми возможными кодами байта MRM и байта SIB.


looch-disasm.narod.ru

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *