коды команд ассемблера таблица

FE23 LOOCH DISASM


СПРАВОЧНИК ПО КОМАНДАМ
ПРОЦЕССОРОВ x86


коды команд ассемблера таблица. . коды команд ассемблера таблица фото. коды команд ассемблера таблица-. картинка коды команд ассемблера таблица. картинка . В таблицах настоящего справочника в колонке Команда показано имя команды на языке ассемблера.
ГлавнаяЗагрузкаИнструкцияКоманды x86Карта сайта

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

КОМАНДЫ АССЕМБЛЕРА
И МАШИННЫЕ КОМАНДЫ


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Источник

Пояснения к основным таблицам

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

Содержание

Примеры из разных таблиц

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

КодКомандаФормат
00ADD——dw MRM
04ADD——-w data(1)
83 /000ADD——sw NNN data(1)
9ESAHF———
0F 01 /100SMSW——— NNN
6APUSH——s- data(1)
46INC ESI——reg
8CMOV——d- MRM
B9MOV ECX—-wreg data(2/4)
A3MOV——dw addr(2/4)
0F B6MOVZX——-w MRM

Предварительные замечания

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

Команды ассемблера и машинные командыНа этой же странице есть дополнительные объяснения про термин «основной байт кода операции», такой термин часто используется в данном справочние.

Кроме того, полезно ознакомиться со страницей

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

Колонка Команда содержит имя команды на языке ассемблера. Иногда рядом добавляется имя регистра, так бывает, если регистр задается (в качестве операнда) прямо в коде операции.

Колонка Формат показывает формат машинной команды. Используемые при этом условные обозначения объясняются ниже. Следует особо подчеркнуть, что формат относится к машинной команде, а не к команде на языке ассемблера.

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

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

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

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

Первым в формате всегда идет «основной байт кода операции».

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

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

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

Особые биты и битовые поля в основном байте

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

Возможны следующие биты и битовые поля.

Примечание. Не путайте бит ( s ) с полем из двух битов ( sr ) или из трех битов ( sgr ).

Поле ( sr ), состоящее из двух бит, или поле ( sgr ) из трех бит («segment register») определяет сегментный регистр, с которым работает данная команда. Регистры ES, CS, SS, DS могут быть заданы в двухбитном поле ( sr ) или в трехбитном поле ( sgr ). Регистры FS и GS могут задаваться только в трехбитном поле ( sgr ). Коды задания сегментных регистров смотрите на странице Коды сегментных регистров.

Поле ( fpu ), состоящее из трех бит («floating-point unit»), присутствует в первом байте команд сопроцессора с плавающей точкой. Код операции для сопроцессора состоит из шести бит. Старшие три бита находятся в поле ( fpu ) первого байта, младшие в поле ( reg ) байта ( mod,reg,r/m ). См. ниже про обозначение ( NNN ).

Примечание. Для ранних процессоров x86 сопроцессор с плавающей точкой был отдельным устройством. Начиная с i486, сопроцессор входит в состав основного процессора.

Дополнительные байты в машинной команде

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

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

Обозначение MRM

Если в формате машинной команды присутствует обозначение MRM, то при записи этой команды на языке ассемблера байту ( mod,reg,r/m ) соответствуют два операнда. Один из этих операндов соответствует полю ( reg ) и задает регистр, а второй операнд соответствует полю ( r/m ) и задает либо регистр, либо адрес в памяти. Порядок следования этих двух операндов может оказаться разным для разных конкретных команд.

В колонке «Формат» ставится только обозначение MRM и не показываются другие байты (второй байт режима адресации и байты смещения), связанные с байтом MRM. То же самое односится и к обозначению NNN, о котором рассказано ниже.

Обозначение NNN

Обозначение NNN тоже означает, что после байта с кодом операции идет далее байт MRM ( mod,reg,r/m ) и все последующие байты, к нему относящиеся. Таким образом, если в команде присутствует байт MRM, то в таблицах справочника в колонке «Формат» это будет показано либо обозначением MRM, либо обозначением NNN.

В отличие от случая, обозначенного как ( MRM ), в случае ( NNN ) трехбитное поле ( reg ) в байте ( mod,reg,r/m ) не задает регистр. Эти три бита поля ( reg ) присоединяются к коду операции и тогда уже этот удлиненный код операции будет определять, какая команда должна выполняться. Таким образом, если в формате команды присутствует ( NNN ), то с данным значением основного байта кода операции получается уже не одна машинная команда, а целая группа из восьми разных машинных команд. (Три дополнительных бита могут иметь восемь разных значений).

Если в формате машинной команды присутствует обозначение NNN, то при записи этой команды на языке ассемблера байту ( mod,reg,r/m ) соответствует только один операнд. Этот операнд соответствует полю ( r/m ) и задает либо регистр, либо адрес в памяти.

Если для некоторой команды в таблице, в колонке «Формат» стоит обозначение NNN, то в той же строке таблицы в колонке «Код» (или в колонке «Команда») будет показано значение поля ( reg ) байта ( mod,reg,r/m ), которое должно быть для этой команды. Это значение дается в двоичном виде после дробной черты, например, ( /010 ).

Имеется несколько случаев, когда значение поля ( reg ) байта ( mod,reg,r/m ) никак не используется и должно быть всегда равно нулю. Таких случаев совсем немного:

Для этих случаев в колонке формат тоже ставится обозначение NNN. Однако, чтобы не загромождать таблицы, значение ( reg ), равное ( /000 ), показано не везде. На языке ассемблера в этих случаях байту ( mod,reg,r/m ) все также соответствует только один операнд (регистр или память), о чем и свидетельствует обозначение NNN.

Обозначение addr(. )

Обозначение addr(. ) означает, что в состав команды входят байты задающие адрес. Это может быть полный адрес, то есть, смещение относительно начала сегмента, или сокращенный относительный адрес.

После слова ( addr ) в скобках указывается количество байт. Если количество байт может быть разным (для разных режимов работы 16/32 бит), то указываются два числа через дробь, например: addr(2/4).

Обозначение data(. )

Непосредственный операнд, задаваемый прямо в команде, это всегда числовая константа. Чаще всего, это операнд в арифметических операциях, Но возможны и другие случаи, например, величина сдвига в командах сдвига или номер порта в командах ввода/вывода через порт.

На языке ассемблера обозначению data(. ) соотвествует один операнд.

Источник

Справка по Ассемблеру для Atmel AVR

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

Строка кода не должна быть длиннее 120 символов.

Любая строка может начинаться с метки, которая является набором символов заканчивающимся двоеточием. Метки используются для указания места, в которое передаётся управление при переходах, а также для задания имён переменных.

Входная строка может иметь одну из четырёх форм:

Комментарий имеет следующую форму:

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

Примеры:

test:═════ rjmp test════ ; Бесконечный цикл (Это инструкция)
════════════════════════ ; Строка с одним только комментарием

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

═ Инструкции процессоров AVR

Ниже приведен набор команд процессоров AVR, более детальное описание их можно найти в AVR Data Book.

Арифметические и логические инструкции

Инструкции ветвления

Инструкции передачи данных

* Для операций доступа к данным количество циклов указано при условии доступа к внутренней памяти данных, и не корректно при работе с внешним ОЗУ. Для инструкций LD, ST, LDD, STD, LDS, STS, PUSH и POP, необходимо добавить один цикл плюс по одному циклу для каждого ожидания.

Инструкции работы с битами


Ассемблер не различает регистр символов.

Операнды могут быть таких видов:

Rd: Результирующий (и исходный) регистр в регистровом файле
Rr: Исходный регистр в регистровом файле
b: Константа (3 бита), может быть константное выражение
s: Константа (3 бита), может быть константное выражение
P: Константа (5-6 бит), может быть константное выражение
K6; Константа (6 бит), может быть константное выражение
K8: Константа (8 бит), может быть константное выражение
k: Константа (размер зависит от инструкции), может быть константное выражение
q: Константа (6 бит), может быть константное выражение
Rdl:═ R24, R26, R28, R30. Для инструкций ADIW и SBIW
X,Y,Z: Регистры косвенной адресации (X=R27:R26, Y=R29:R28, Z=R31:R30)

Директивы ассемблера

Компилятор поддерживает ряд директив. Директивы не транслируются непосредственно в код. Вместо этого они используются для указания положения в программной памяти, определения макросов, инициализации памяти и т.д. Список директив приведён в следующей таблице.

ДирективаОписание
BYTE Зарезервировать байты в ОЗУ
CSEG Программный сегмент
DB Определить байты во флэш или EEPROM
DEF Назначить регистру символическое имя
DEVICE Определить устройство для которого компилируется программа
DSEG Сегмент данных
DW Определить слова во флэш или EEPROM
ENDM, ENDMACRO Конец макроса
EQU Установить постоянное выражение
ESEG Сегмент EEPROM
EXIT Выйти из файла
INCLUDE Вложить другой файл
LIST Включить генерацию листинга
LISTMAC Включить разворачивание макросов в листинге
MACROНачало макроса
NOLIST Выключить генерацию листинга
ORG Установить положение в сегменте
SET Установить переменный символический эквивалент выражения

Все директивы предваряются точкой.

Директива BYTE резервирует байты в ОЗУ. Если вы хотите иметь возможность ссылаться на выделенную область памяти, то директива BYTE должна быть предварена меткой. Директива принимает один обязательный параметр, который указывает количество выделяемых байт. Эта директива может использоваться только в сегменте данных(смотреть директивы CSEG и DSEG). Выделенные байты не инициализируются.

.CSEG
════════ ldi r30,low(var1)═ ; Загружает младший байт регистра Z
════════ ldi r31,high(var1) ; Загружает старший байт регистра Z
════════ ld r1,Z═══════════ ; Загружает VAR1 в регистр 1

Директива CSEG определяет начало программного сегмента. Исходный файл может состоять из нескольких программных сегментов, которые объединяются в один программный сегмент при компиляции. Программный сегмент является сегментом по умолчанию. Программные сегменты имеют свои собственные счётчики положения которые считают не побайтно, а по словно. Директива ORG может быть использована для размещения кода и констант в необходимом месте сегмента. Директива CSEG не имеет параметров.

Директива DB резервирует необходимое количество байт в памяти программ или в EEPROM. Если вы хотите иметь возможность ссылаться на выделенную область памяти, то директива DB должна быть предварена меткой. Директива DB должна иметь хотя бы один параметр. Данная директива может быть размещена только в сегменте программ (CSEG) или в сегменте EEPROM (ESEG).

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

Синтаксис:
.DEF Символическое_имя = Регистр

.CSEG
═ldi temp,0xf0═ ; Загрузить 0xf0 в регистр temp (R16)
═in ior,0x3f═ ; Прочитать SREG в регистр ior (R0)
═eor temp,ior═ ; Регистры temp и ior складываются по исключающему или

Директива DEVICE позволяет указать для какого устройства компилируется программа. При использовании данной директивы компилятор выдаст предупреждение, если будет найдена инструкция, которую не поддерживает данный микроконтроллер. Также будет выдано предупреждение, если программный сегмент, либо сегмент EEPROM превысят размер допускаемый устройством. Если же директива не используется то все инструкции считаются допустимыми, и отсутствуют ограничения на размер сегментов.

Синтаксис:
.DEVICE AT90S1200 |AT90S2313 | AT90S2323 | AT90S2333 | AT90S2343 | AT90S4414 | AT90S4433 | AT90S4434 | AT90S8515 | AT90S8534 | AT90S8535 | ATtiny11 | ATtiny12 | ATtiny22 | ATmega603 | ATmega103

Пример:
.DEVICE AT90S1200═ ; Используется AT90S1200

.CSEG
═══════ push r30══ ; Эта инструкция вызовет предупреждение
══════════════════ ; поскольку AT90S1200 её не имеет

Директива DSEG определяет начало сегмента данных. Исходный файл может состоять из нескольких сегментов данных, которые объединяются в один сегмент при компиляции. Сегмент данных обычно состоит только из директив BYTE и меток. Сегменты данных имеют свои собственные побайтные счётчики положения. Директива ORG может быть использована для размещения переменных в необходимом месте ОЗУ. Директива не имеет параметров.

.CSEG
═══════ ldi r30,low(var1)═══ ; Загрузить младший байт регистра Z
═══════ ldi r31,high(var1)══ ; Загрузить старший байт регистра Z
═══════ ld r1,Z═════════════ ; Загрузить var1 в регистр r1

Директива DW резервирует необходимое количество слов в памяти программ или в EEPROM. Если вы хотите иметь возможность ссылаться на выделенную область памяти, то директива DW должна быть предварена меткой. Директива DW должна иметь хотя бы один параметр. Данная директива может быть размещена только в сегменте программ (CSEG) или в сегменте EEPROM (ESEG).

Директива определяет конец макроопределения, и не принимает никаких параметров. Для информации по определению макросов смотрите директиву MACRO.

Пример:
.MACRO SUBI16══════════════ ; Начало определения макроса
═══════ subi r16,low(@0)═══ ; Вычесть младший байт первого параметра
═══════ sbci r17,high(@0)══ ; Вычесть старший байт первого параметра
.ENDMACRO

Директива EQU присваивает метке значение. Эта метка может позднее использоваться в выражениях. Метка которой присвоено значение данной директивой не может быть переназначена и её значение не может быть изменено.

Синтаксис:
.EQU метка = выражение

Пример:
.EQU io_offset = 0x23
.EQU porta════ = io_offset + 2

.CSEG════════════════ ; Начало сегмента данных
═══════ clr r2═══════ ; Очистить регистр r2
═══════ out porta,r2═ ; Записать в порт A

Директива ESEG определяет начало сегмента EEPROM. Исходный файл может состоять из нескольких сегментов EEPROM, которые объединяются в один сегмент при компиляции. Сегмент EEPROM обычно состоит только из директив DB, DW и меток. Сегменты EEPROM имеют свои собственные побайтные счётчики положения. Директива ORG может быть использована для размещения переменных в необходимом месте EEPROM. Директива не имеет параметров.

Встретив директиву EXIT компилятор прекращает компиляцию данного файла. Если директива использована во вложенном файле (см. директиву INCLUDE), то компиляция продолжается со строки следующей после директивы INCLUDE. Если же файл не является вложенным, то компиляция прекращается.

Пример:
.EXIT═ ; Выйти из данного файла

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

Пример:
; файл iodefs.asm:
.EQU sreg══ = 0x3f════ ; Регистр статуса
.EQU sphigh = 0x3e════ ; Старший байт указателя стека
.EQU splow═ = 0x3d════ ; Младший байт указателя стека

; файл incdemo.asm
.INCLUDE iodefs.asm═══ ; Вложить определения портов
═══════ in r0,sreg════ ; Прочитать регистр статуса

Директива LIST указывает компилятору на необходимость создания листинга. Листинг представляет из себя комбинацию ассемблерного кода, адресов и кодов операций. По умолчанию генерация листинга включена, однако данная директива используется совместно с директивой NOLIST для получения листингов отдельных частей исходных файлов.

Пример:
.NOLIST═══════════════ ; Отключить генерацию листинга
.INCLUDE "macro.inc"══ ; Вложенные файлы не будут
.INCLUDE "const.def"══ ; отображены в листинге
.LIST═════════════════ ; Включить генерацию листинга

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

Пример:
.MACRO MACX════════ ; Определение макроса
═══════ add═ r0,@0═ ; Тело макроса
═══════ eor═ r1,@1═
.ENDMACRO══════════ ; Конец макроопределения

.LISTMAC═══════════ ; Включить разворачивание макросов
═══════ MACX r2,r1═ ; Вызов макроса (в листинге будет показано тело макроса)

С директивы MACRO начинается определение макроса. В качестве параметра директиве передаётся имя макроса. При встрече имени макроса позднее в тексте программы, компилятор заменяет это имя на тело макроса. Макрос может иметь до 10 параметров, к которым в его теле обращаются через @0-@9. При вызове параметры перечисляются через запятые. Определение макроса заканчивается директивой ENDMACRO.

По умолчанию в листинг включается только вызов макроса, для разворачивания макроса необходимо использовать директиву LISTMAC. Макрос в листинге показывается знаком +.

Синтаксис:
.MACRO макроимя

Пример:
.MACRO SUBI16══════════════════ ; Начало макроопределения
═══════ subi @1,low(@0)════════ ; Вычесть младший байт параметра 0 из параметра 1
═══════ sbci @2,high(@0)═══════ ; Вычесть старший байт параметра 0 из параметра 2
.ENDMACRO══════════════════════ ; Конец макроопределения

.CSEG══════════════════════════ ; Начало программного сегмента
═══════ SUBI16 0x1234,r16,r17══ ; Вычесть 0x1234 из r17:r16

Директива NOLIST указывает компилятору на необходимость прекращения генерации листинга. Листинг представляет из себя комбинацию ассемблерного кода, адресов и кодов операций. По умолчанию генерация листинга включена, однако может быть отключена данной директивой. Кроме того данная директива может быть использована совместно с директивой LIST для получения листингов отдельных частей исходных файлов

Пример:
.NOLIST═══════════════ ; Отключить генерацию листинга
.INCLUDE "macro.inc"══ ; Вложенные файлы не будут
.INCLUDE "const.def"══ ; отображены в листинге
.LIST═════════════════ ; Включить генерацию листинга

.CSEG
.ORG 0x10═══════════ ; Установить программный счётчик равным 0x10
═════════ mov r0,r1═ ; Данная команда будет размещена по адресу 0x10

Директива SET присваивает имени некоторое значение. Это имя позднее может быть использовано в выражениях. Причем в отличии от директивы EQU значение имени может быть изменено другой директивой SET.

Синтаксис:
.SET имя = выражение

Пример:
.SET io_offset = 0x23
.SET porta════ = io_offset + 2

.CSEG════════════════ ; Начало кодового сегмента
═══════ clr r2═══════ ; Очистить регистр 2
═══════ out porta,r2═ ; Записать в порт A

Выражения

Компилятор позволяет использовать в программе выражения которые могут состоять операндов, знаков операций и функций. Все выражения являются 32-битными.

Операнды

Могут быть использованы следующие операнды:

Операции

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

ПриоритетСимволОписание
14!Логическое отрицание
14Побитное отрицание
14-Минус
13*Умножение
13/Деление
12+Суммирование
12-Вычитание
11 >Сдвиг вправо
10Больше чем
10>=Больше или равно
9==Равно
9!=Не равно
8&Побитное И
7^Побитное исключающее ИЛИ
6|Побитное ИЛИ
5&&Логическое И
4||Логическое ИЛИ

Логическое отрицание

Побитное отрицание

Описание: Возвращает выражение в котором все биты проинвертированы
Приоритет: 14
Пример: ldi r16,

0xf0═ ; В r16 загрузить 0x0f

Минус

Умножение

Символ: *
Описание: Возвращает результат умножения двух выражений
Приоритет: 13
Пример: ldi r30, label*2

Деление

Символ: /
Описание: Возвращает целую часть результата деления левого выражения на правое
Приоритет: 13
Пример: ldi r30, label/2

Суммирование

Символ: +
Описание: Возвращает сумму двух выражений
Приоритет: 12
Пример: ldi r30, c1+c2

Вычитание

Сдвиг влево

Символ: >
Описание: Возвращает левое выражение сдвинутое вправо на число бит указанное справа
Приоритет: 11
Пример: ldi r17, c1>>c2═ ; В r17 загрузить c1 сдвинутое вправо c2 раз

Меньше чем

Символ:
Описание: Возвращает 1 если левое выражение больше чем правое (учитывается знак), и 0 в противном случае
Приоритет: 10
Пример: ori r18, bitmask*(c1>c2)+1

Больше или равно

Символ: >=
Описание: Возвращает 1 если левое выражение больше или равно чем правое (учитывается знак), и 0 в противном случае
Приоритет: 10
Пример: ori r18, bitmask*(c1>=c2)+1

Равно

Символ: ==
Описание: Возвращает 1 если левое выражение равно правому (учитывается знак), и 0 в противном случае
Приоритет: 9
Пример: andi r19, bitmask*(c1==c2)+1

Не равно

Побитное И

Символ: &
Описание: Возвращает результат побитового И выражений
Приоритет:═ 8
Пример: ldi r18, High(c1&c2)

Побитное исключающее ИЛИ

Символ: ^
Описание: Возвращает результат побитового исключающего ИЛИ выражений
Приоритет: 7
Пример: ldi r18, Low(c1^c2)

Побитное ИЛИ

Символ: |
Описание: Возвращает результат побитового ИЛИ выражений
Приоритет: 6
Пример: ldi r18, Low(c1|c2)

Логическое И

Символ: &&
Описание: Возвращает 1 если оба выражения не равны нулю, и 0 в противном случае
Приоритет: 5
Пример: ldi r18, Low(c1&&c2)

Логическое ИЛИ

Символ: ||
Описание: Возвращает 1 если хотя бы одно выражение не равно нулю, и 0 в противном случае
Приоритет: 4
Пример: ldi r18, Low(c1||c2)

Функции

Определены следующие функции:

Использование программы

Этот раздел описывает использование компилятора и встроенного редактора

Открытие файлов

В WAVRASM могут быть открыты как новые так и существующие файлы. Количество открытых файлов ограничено размером памяти, однако объём одного файла не может превышать 28 килобайт (в связи с ограничением MS-Windows). Компиляция файлов большего размера возможна, но они не могут быть редактируемы встроенным редактором. Каждый файл открывается в отдельном окне.

Сообщения об ошибках

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

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

Учтите, что если вы внесли изменения в исходные тексты (добавили или удалили строки), то информация о номерах строк в окне сообщений не является корректной.

Опции

Некоторые установки программы могут быть изменены через пункт меню «Options».

Atmel, AVR являются зарегистрированными товарными знаками фирмы Atmel Corporation

Источник

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

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