Табличные команды на языке ассемблера. Структура команды на языке ассемблера программирование на уровне. Формат данных и структура команд языка ассемблер

  • 03.03.2020

Для того чтобы машина могла выполнить команды человека на аппаратном уровне, необходимо задать определенную последовательность действий на языке «ноликов и единиц». Помощником в этом деле станет Ассемблер. Это утилита, которая работает с переводом команд на машинный язык. Однако написание программы - весьма трудоемкий и сложный процесс. Данный язык не предназначен для создания легких и простых действий. На данный момент любой используемый язык программирования (Ассемблер работает прекрасно) позволяет написать специальные эффективные задачи, которые сильно влияют на работу аппаратной части. Основным предназначением является создание микрокоманд и небольших кодов. Данный язык дает больше возможностей, чем, например, Паскаль или С.

Краткое описание языков Ассемблера

Все языки программирования разделяются по уровням: низкий и высокий. Любой из синтаксической системы «семейки» Ассемблера отличается тем, что объединяет сразу некоторые достоинства наиболее распространенных и современных языков. С другими их роднит и то, что в полной мере можно использовать систему компьютера.

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

Кратко о структуре языка

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

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

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

Язык Ассемблера имеет несколько синтаксисов, которые будут рассмотрены в статье.

Плюсы языка

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

Драйвера, операционные системы, BIOS, компиляторы, интерпретаторы и т. д. - это все программа на языке Ассемблера.

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

Минусы языка

К сожалению, начинающим программистам (и зачастую профессионалам) трудно разобрать язык. Ассемблер требует подробного описания необходимой команды. Из-за того, что нужно использовать машинные команды, растет вероятность ошибочных действий и сложность выполнения.

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

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

Команды языка

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


Использование директив

Программирование микроконтроллеров на языке (Ассемблер это позволяет и прекрасно справляется с функционированием) самого низкого уровня в большинстве случаев заканчивается удачно. Лучше всего использовать процессоры с ограниченным ресурсом. Для 32-разрядной техники данный язык подходит отлично. Часто в кодах можно заметить директивы. Что же это? И для чего используется?

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


Происхождение названия

Благодаря чему получил название язык - "Ассемблер"? Речь идет о трансляторе и компиляторе, которые и производят зашифровку данных. С английского Assembler означает не что иное, как сборщик. Программа не была собрана вручную, была использована автоматическая структура. Более того, на данный момент уже у пользователей и специалистов стерлась разница между терминами. Часто Ассемблером называют языки программирования, хотя это всего лишь утилита.

Из-за общепринятого собирательного названия у некоторых возникает ошибочное решение, что существует единый язык низкого уровня (или же стандартные нормы для него). Чтобы программист понял, о какой структуре идет речь, необходимо уточнять, для какой платформы используется тот или иной язык Ассемблера.

Макросредства

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

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

По назначению можно выделить команды (в скобках приводятся примеры мнемонических кодов операций команд ассемблера ПК типа IBM PC):

l выполнения арифметических операций (ADD и ADC - сложения и сложения с переносом, SUB и SBB - вычитания и вычитания с заемом, MUL и IMUL - умножения без знака и со знаком, DIV и IDIV - деления без знака и со знаком, CMP - сравнения и т. д.);

l выполнения логических операций (OR, AND, NOT, XOR, TEST и т. д.);

l пересылки данных (MOV - переслать, XCHG - обменять, IN - ввести в микропроцессор, OUT - вывести из микропроцессора и т. д.);

l передачи управления (ветвления программы: JMP - безусловного перехода, CALL - вызова процедуры, RET - возврата из процедуры, J* - условного перехода, LOOP - управления циклом и т. д.);

l обработки строк символов (MOVS - пересылки, CMPS - сравнения, LODS - загрузки, SCAS - сканирования. Эти команды обычно используются с префиксом (модификатором повторения) REP;

l прерывания работы программы (INT - программные прерывания, INTO - условного прерывания при переполнении, IRET - возврата из прерывания);

l управления микропроцессором (ST* и CL* - установки и сброса флагов, HLT - останова, WAIT - ожидания, NOP - холостого хода и т. д.).

С полным списком команд ассемблера можно познакомиться в работах .

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

l MOV dst, src - пересылка данных (move - переслать из src в dst).

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

Операнды dst и src должны иметь одинаковый формат - байт или слово.

Src могут иметь тип: r (register) - регистр, m (memory) - память, i (impedance) - непосредственное значение. Dst могут быть типа r, m. Нельзя в одной команде использовать операнды: rsegm совместно с i; два операнда типа m и два операнда типа rsegm). Операнд i может быть и простым выражением:

mov AX, (152 + 101B) / 15

Вычисление выражения выполняется только при трансляции. Флаги не меняет.

l PUSH src - занесение слова в стек (push- протолкнуть; записать в стек изsrc). Помещает в вершину стека содержимое src - любого 16-битового регистра (в том числе и сегментного) или двух ячеек памяти, содержащих 16-битовое слово. Флаги не меняются;

l POP dst - извлечение слова из стека (pop - вытолкнуть; считать из стека в dst). Снимает слово с вершины стека и помещает его в dst - любой 16-битовый регистр (в том числе и сегментный) или в две ячейки памяти. Флаги не меняются.

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

Каждая машинная команда состоит из двух частей:

  • операционной — определяющей, «что делать»;
  • операндной — определяющей объекты обработки, «с чем делать».

Машинная команда микропроцессора, записанная на языке ассемблера, представляет собой одну строку, имеющую следующий синтакический вид:

метка команда/директива операнд(ы) ;комментарии

При этом обязательным полем в строке является команда или директива.

Метка, команда/директива и операнды (если имеются) разделяются по крайней мере одним символом пробела или табуляции.

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

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

Примеры строк кода:

Count db 1 ;Имя, директива, один операнд
mov eax,0 ;Команда, два операнда
cbw ; Команда

Метки

Метка в языке ассемблера может содержать следующие символы:

  • все буквы латинского алфавита;
  • цифры от 0 до 9;
  • спецсимволы: _, @, $, ?.

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

Первым символом в метке должна быть буква или спецсимвол (но не цифра). Максимальная длина метки – 31 символ. Все метки, которые записываются в строке, не содержащей директиву ассемблера, должны заканчиваться двоеточием: .

Команды

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

Директивы

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

Операнды

Операнд – объект, над которым выполняется машинная команда или оператор языка программирования.
Команда может иметь один или два операнда, или вообще не иметь операндов. Число операндов неявно задается кодом команды.
Примеры:

  • Нет операндов ret ;Вернуться
  • Один операнд inc ecx ;Увеличить ecx
  • Два операнда add eax,12 ;Прибавить 12 к eax

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

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

  • идентификаторы;
  • цепочки символов, заключенных в одинарные или двойные кавычки;
  • целые числа в двоичной, восьмеричной, десятичной или шестнадцатеричной системе счисления.
Идентификаторы

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

Правила записи идентификаторов.

  • Идентификатор может состоять из одного или нескольких символов.
  • В качестве символов можно использовать буквы латинского алфавита, цифры и некоторые специальные знаки: _, ?, $, @.
  • Идентификатор не может начинаться символом цифры.
  • Длина идентификатора может быть до 255 символов.
  • Транслятор воспринимает первые 32 символа идентификатора, а остальные игнорирует.
Комментарии

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

Структура программы на ассемблере

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

Пример «ничего не делающей» программы на языке ассемблера:

686P
.MODEL FLAT, STDCALL
.DATA
.CODE
START:

RET
END START

В данной программе представлена всего одна команда микропроцессора. Эта команда RET . Она обеспечивает правильное окончание работы программы. В общем случае эта команда используется для выхода из процедуры.
Остальная часть программы относится к работе транслятора.
.686P — разрешены команды защищенного режима Pentium 6 (Pentium II). Данная директива выбирает поддерживаемый набор команд ассемблера, указывая модель процессора. Буква P, указанная в конце директивы, сообщает транслятору о работе процессора в защищенном режиме.
.MODEL FLAT, stdcall — плоская модель памяти. Эта модель памяти используется в операционной системе Windows. stdcall
.DATA — сегмент программы, содержащий данные.
.CODE — блок программы, содержащей код.
START — метка. В ассемблере метки играют большую роль, что не скажешь о современных языках высокого уровня.
END START — конец программы и сообщение транслятору, что начинать выполнение программы надо с метки START .
Каждый модуль должен содержать директиву END , отмечающую конец исходного кода программы. Все строки, которые следуют за директивой END , игнорируются. Если опустить директиву END , то генерируется ошибка.
Метка, указанная после директивы END , сообщает транслятору имя главного модуля, с которого начинается выполнение программы. Если программа содержит один модуль, метку после директивы END можно не указывать.

Тема 2.5 Основы программирования процессора

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

Язык символического кодирования команд называется ассемблером .

Язык ассемблер – это язык, в котором каждое высказывание соответствует ровно одной машинной команде.

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

Язык ассемблер имеет несколько особенностей, отличающих его от языков высокого уровня:

1. Это взаимно однозначное соответствие между высказываниями языка ассемблера и машинными командами.

2. Программист на языке ассемблера имеет доступ ко всем объектам и командам, присутствующим на целевой машине.

Представление об основах программирования на машинно-ориентированных языках полезно для:



Лучшего понимания архитектуры ПК и более грамотного использования компьютеров;

Для разработки более рациональных структур алгоритмов программ решения прикладных задач;

Возможности просмотра и корректировки исполняемых программ с расширением.exe и.com, компилированных с любых языков высокого уровня, в случае утраты исходных программ (вызвав указанные программы в отладчик программы DEBUG и декомпилировав их отображение на языке ассемблера);

Составления программ решения наиболее ответственных задач (программа, составленная на машинно-ориентированном языке, обычно эффективнее – короче и быстрее процентов на 30-60 программ, полученных в результате трансляции с языков высокого уровня)

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

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

Алфавит языка ассемблера составляют символы ASCII.

Числа только целые. Различают:

Двоичные числа, заканчиваются буквой В;

Десятичные числа, заканчиваются буквой D;

Шестнадцатеричные числа, заканчиваются буквой Н.

Оперативная память, регистры, представление данных

Для определённой серии МП используется индивидуальный язык составления программ – язык ассемблер.

Язык ассемблер занимает промежуточное положение между машинными кодами и языками высокого уровня. Программировать на этом языке проще. Программа на языке ассемблер более рационально использует возможности конкретной машины (точнее МП), чем программа на языке высокого уровня (который более прост для программиста, чем ассемблер). Основные принципы программирования на машинно-ориентированных языках рассмотрим на примере языка ассемблер для МП КР580ВМ80. Для программирования на языке используется общая методика. Конкретные же технические приемы записи программ связаны с особенностями архитектуры и системы команд целевого МП.

Программная модель микропроцессорной системы на основе МП КР580ВМ80

Программная модель МПС в соответствии с рисунком 1

МП Порты Память

S Z AC P C

Рисунок 1

С точки зрения программиста МП КР580ВМ80 имеет следующие программно-доступные регистры.

А – 8-битовый регистр аккумулятор. Является главным регистром МП. Любая операция, выполняемая в АЛУ, предполагает размещение одного из операндов, подлежащих обработке, в аккумуляторе. Результат операции в АЛУ тоже обычно хранится в А.

B, C, D, E, H, L – 8-битовые регистры общего назначения (РОН). Внутренняя память МП. Предназначены для хранения обрабатываемой информации, а также результатов операции. При обработке 16-разрядных слов из регистров образуют пары BC, DE, HL, причем сдвоенный регистр называется первой буквой – B, D, H. В регистровой паре старшим является первый регистр. Особым свойством обладают регистры H, L, используемые как для хранения данных, так и для хранения 16-разрядных адресов ячеек ОЗУ.

FL – регистр флагов (регистр признаков) 8-битовый регистр, в котором сохраняются пять признаков результата выполнения арифметических и логических операций в МП. Формат FL в соответствии с рисунком

Разряд С (CY - carry) - перенос, устанавливается в 1, если был перенос из старшего разряда байта при выполнении арифметических операций.

Разряд Р (parity) – четность, устанавливается в 1, если число единиц в разрядах результата четно.

Разряд АС – дополнительный перенос, предназначен для хранения значения переноса из младшей тетрады результата.

Разряд Z (нуль) – устанавливается в 1, если результат операции равен 0.

Разряд S (знак) – устанавливается в 1, если результат отрицательный, и в 0, если результат положительный.

SP –- указатель стека, 16-разрядный регистр, предназначен для хранения адреса ячейки памяти, куда был записан последний введенный в стек байт.

РС – программный счетчик (счетчик команд), 16-разрядный регистр, предназначен для хранения адреса следующей выполняемой команды. Содержимое счетчика команд автоматически увеличивается на 1 сразу же после выборки очередного байта команды.

В начальной области памяти адреса 0000Н – 07FF располагается управляющая программа и демонстрационные программы. Это область ПЗУ.

0800 – 0АFF - область адресов для записи исследуемых программ. (ОЗУ).

0В00 – 0ВВ0 - область адресов для записи данных. (ОЗУ).

0ВВ0 – начальный адрес стека. (ОЗУ).

Стек – специально организованная область ОЗУ, предназначенная для временного хранения данных или адресов. Число, записанное в стек последним, извлекается из него первым. Указатель стека хранит адрес последней ячейки стека, в которой записана информация. При вызове подпрограммы в стеке автоматически сохраняется адрес возврата в основную программу. Как правило, в начале каждой подпрограммы сохраняются в стеке содержимое всех задействованных при ее выполнении регистров, а в конце подпрограммы восстанавливают их из стека.

Формат данных и структура команд языка ассемблер

Память МП КР580ВМ80 представляет собой массив 8-ьитных слов, называемых байтами, Каждый байт имеет свой 16-разрядный адрес, определяющий его положение в последовательности ячеек памяти. МП может адресовать 65536 байт памяти, которая может содержать как в ПЗУ, так и в ОЗУ.

Формат данных

Данные хранятся в памяти в виде 8-битных слов:

D7 D6 D5 D4 D3 D2 D1 D0

Младшим битом является бит 0, старшим – бит 7.

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

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

Команды МП КР580ВМ80 имеют одно, двух или трехбайтный формат. Многобайтные команды должны быть размещены в соседних ЯП. Формат команды зависит от особенностей выполняемой операции.

Первый байт команды содержит код операции, записанный в мнемоническом виде.

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

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

Формат однобайтовой команды в соответствии с рисунком 2

Рисунок 4

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

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


Методы адресации

Все коды операндов (входные и выходные) должны где-то располагаться. Они могут находиться во внутренних регистрах МП (наиболее удобный и быстрый вариант). Они могут располагаться в системной памяти (самый распространенный вариант). Наконец, они могут находиться в устройствах ввода-вывода (наиболее редкий случай). Определение места положения операндов производится кодом команды. Существуют разные методы, с помощью которых код команды может определить, откуда брать входной операнд и куда помещать выходной операнд. Эти методы называются методами адресации.

Для МП КР580ВМ80 существуют следующие методы адресации:

Непосредственная;

Регистровая;

Косвенная;

Стековая.

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

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

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

Косвенная (неявная)адресация предполагает, что во внутреннем регистре МП находится не сам операнд, а его адрес в памяти.

Стековая адресация предполагает, что команда не содержит адрес. Адресация к ячейкам памяти по содержимому 16-разрядного регистра SP (указателя стека).

Система команд

Система команд МП – это полный перечень элементарных действий, которые способен производить МП. Управляемый этими командами МП выполняет простые действия, такие как элементарные арифметические и логические операции, пересылку данных, сравнение двух величин и др. Число команд МП КР580ВМ80 - 78 (с учетом модификаций 244).

Различают следующие группы команд:

Передачи данных;

Арифметические;

Логические;

Команды перехода;

Команды ввода-вывода, управления и работы со стеком.


Символы и сокращения, применяемые при описании команд и составлении программ

Символ Сокращение
ADDR 16-битовый адрес
DATA 8-битовые данные
DATA 16 16-битовые данные
PORT 8-битовый адрес УВВ (устройства ввода-вывода)
BYTE 2 Второй байт команды
BYTE 3 Третий байт команды
R, R1, R2 Один из регистров: A, B, C, D, E, H, L
RP Одна из регистровых пар: В - задает пару ВС; D - задает пару DE; H – задает пару HL
RH Первый регистр пары
RL Второй регистр пары
Λ Логическое умножение
V Логическое сложение
Сложение по модулю два
М Ячейка памяти, адрес которой задаёт содержимое регистровой пары HL, т. е. М = (HL)

Общие сведения о языке ассемблера

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

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

Символические имена, вводимые при программировании на языке ассемблера, как правило отражают семантику программы, а аббревиатура команд - их основную функцию. Например: PARAM - параметр, TABLE - таблица, MASK - маска, ADD - сложение, SUB - вычитание и т.д. п. Такие имена легко запоминаются программистом.

Для программирования на языке ассемблера необходимо иметь сложные инструментальные средства, чем при программировании на машинном языке: нужны вычислительные комплексы на базе микро - ЭВМ или ПЭВМ с комплектом периферийных устройств (алфавитно-цифровая клавиатура, символьный дисплей, НГМД и печатающее устройство), а также резидентные или кросс-системы программирования для необходимых типов микропроцессоров. Язык ассемблера позволяет эффективно писать и отлаживать значительно более сложные программы, чем машинный язык (до 1 - 4 Кбайт).

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

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

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

С помощью языка ассемблера программист может задать следующие параметры:

мнемонику (символическое имя) каждой команды машинного языка микропроцессора;

стандартный формат для строк программы, описываемой на ассемблере;

формат для указания различных способов адресации и вариантов команд;

формат для указания символьных констант и констант целочисленного типа в различных системах счисления;

псевдокоманды, управляющие процессом ассемблирования (трансляции) программы.

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

Для микро - ЭВМ, построенных на базе наиболее распространенных типов микропроцессоров, может существовать несколько вариантов языка ассемблера, однако практическое распространение обычно имеет один - это так называемый стандартный язык ассемблера

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

Каждая машинная команда состоит из двух частей:

· операционной - определяющей, "что делать";

· операндной - определяющей объекты обработки, "с чем делать".

Машинная команда микропроцессора, записанная на языке ассемблера, представляет собой одну строку, имеющую следующий синтакический вид:

метка команда/директива операнд(ы) ;комментарии

При этом обязательным полем в строке является команда или директива.

Метка, команда/директива и операнды (если имеются) разделяются по крайней мере одним символом пробела или табуляции.

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

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

Прямая адресация : эффективный адрес определяется непосредственно полем смещения машинной команды, которое может иметь размер 8, 16 или 32 бита.

mov eax, sum ; eax = sum

Ассемблер заменяет sum на соответствующий адрес, хранящийся в сегменте данных (по умолчанию адресуется регистром ds) и значение, хранящееся по адресу sum, помещает в регистр eax.

Косвенная адресация в свою очередь имеет следующие виды:

· косвенная базовая (регистровая) адресация;

· косвенная базовая (регистровая) адресация со смещением;

· косвенная индексная адресация;

· косвенная базовая индексная адресация.

Косвенная базовая (регистровая) адресация. При такой адресации эффективный адрес операнда может находиться в любом из регистров общего назначения, кроме sp/esp и bp/ebp (это специфические регистры для работы с сегментом стека). Синтаксически в команде этот режим адресации выражается заключением имени регистра в квадратные скобки .

mov eax, ; eax = *esi; *esi значение по адресу esi