Алгоритм выполнения лабораторной работы
1. Ознакомиться с целью и задачами лабораторной работы.
2. Изучить теоретический материал.
3. Выяснить неясные вопросы у преподавателя.
4. Ознакомиться с индивидуальным заданием из таблицы 2.4.
5. Составить алгоритм выполнения программы для указанного варианта задания.
6. Руководствуясь указаниями из первой лабораторной работы, написать, транслировать и выполнить программу на ЭВМ.
7. Запустить программу с помощью Турбо Дебюггера (TD) в режиме отладки.
8. Выполнить программу в пошаговом режиме, проследив все этапы пересылки данных из регистров в регистры и из ячеек памяти в регистры.
9. Найти в дампе памяти программы используемые данные и их адреса.
10. Записать итоговые значения регистров процессора, адреса используемых таблиц данных.
11. Ответить на контрольные вопросы по лабораторной работе.
12. Выяснить возникшие затруднения у преподавателя.
13. Подготовить отчет о выполненной работе.
14. Защитить выполненную работу у преподавателя, ответив на поставленные вопросы.
Теоретическая часть
В методических материалах под термином “персональный компьютер” (сокращенно ПК) понимается персональная ЭВМ с системой команд х86. Первые 16–разрядные ПК появились в 1981 г., в настоящее же время активно распространяются 64 и 128–разрядные ПК. Но во всех моделях ЭВМ фирмы INTEL строго соблюдается программная преемственность. Это означает что программа, написанная для ЭВМ младшей модели, например IBM PC AT, без каких - либо изменений выполняется на любой старшей модели ЭВМ. Такая совместимость снизу вверх обеспечивается тем, что процессоры, составляющие основу и сердце ЭВМ всех типов, используют одну систему команд языка Ассемблера, хотя структура и архитектура различных моделей процессоров значительно отличаются между собой. В старшие модели ПК лишь добавляются новые команды, необходимые для многозадачных и мультимедийных режимов. Таким образом, процессор 8086 может служить базовым процессором для изучения функционирования блоков и устройств ПК всех остальных моделей данного семейства.
Укрупненная блок-схема компьютера классической (фон-Немановской) архитектуры показана на рисунке 2.1. Она состоит из:
а) процессора;
б) каналов связи(внешнего интерфейса);
в) оперативной (или основной) памяти;
г) внешней памяти;
д) устройств ввода–вывода;
ж) прочих внешних устройств.
Процессор − это мозг компьютера. Его задача − выполнять команды программ находящихся в основной памяти. Он читает команды из памяти, распознает их, а затем выполняет их одну за другой.
Состав процессора:
· устройство управления, которое синхронизирует работу всех блоков и устройств вычислительной системы и управляет ее работой;
· арифметико-логического устройство выполняет логические, арифметические, сдвиговые и прочие операции над целыми данными;
· внутрипроцессорная память хранит промежуточные результаты вычислений и некоторые команды управления. Эта память состоит из нескольких регистров, выполняющих общие и специальные функции. Память работает на частоте процессора CPU (Central Processor Unit);
· устройство преобразования адресов памяти − основная функция вычисление адреса операндов и команд в основной памяти, используя для этого различные режимы адресации;
· интерфейсный блок с микросхемами системной поддержки − обеспечивает связь процессора с памятью и другими внешними устройствами посредством внешнего интерфейса, системных шин и адаптеров связи.
Системные шины − это шина данных (ШД), шина адресов (ША), шина управления (ШУ). Каналы связи(внешнего интерфейса) – служат для сопряжения процессора с его внешними устройствами.
Оперативная (или основная) память− запоминающее устройство, используемое для оперативного хранения данных и программ, а также обмена информацией с другими устройствами ЭВМ.
Внешние устройства обеспечивают эффективное взаимодействие компьютера с окружающей средой: пользователями, объектами управления, другими машинами. В состав внешних устройств обязательно входят внешняя память и устройства ввода-вывода и прочие устройства.
Базовый цикл работы процессора
Процессоры ПК архитектуры фон-Неймана выполняют команды последовательно, одну за другой, выбирая их из основной или буферной памяти. Для каждой команды реализуются следующие действия:
1) вычисление адреса команды;
2) чтение команды из памяти;
3) дешифрация команды (преобразование во внутренний микрокод CPU);
4) модификация содержимого IP;
5) вычисление адреса операндов;
6) чтение (выборка) операндов из памяти на регистры процессора;
7) исполнение операции над выбранными операндами;
8) вычисление адреса результата;
9) запись результата операции в память или регистры процессора;
10) переход в пункт первый.
В результате получается цикл выборки, дешифрации и исполнения команды, который называется базовым циклом работы процессора.
Автоматический инкремент (увеличение значения) регистра IP на величину, равную количеству байт извлеченной из памяти команды сразу после её дешифрации (то есть вычисление адреса очередной команды) производится для того чтобы обеспечить опережающее чтение очередной команды из памяти (исключить первый пункт из базового цикла). Таким образом, при выполнении очередной команды в IP находится адрес следующей команды.
При инкременте IP команды последовательно выполняются в том порядке, в каком они хранятся в памяти, и только при «переходе» или «вызове» подпрограммы содержимое IP изменяется на величину смещения, указанного в имени вызываемой подпрограммы или метки.
Упрощенная структурная схема подобного процессора представлена на рисунке 2.1.
Этот процессор работает согласно указанному выше алгоритму. Все блоки процессора связаны внутрисистемной шиной, в которую входят шина данных, шина управления и шина адресов.
Преобразователь адресов на основании информации из сегментных регистров и арифметическо-логического устройства формирует 20–битный адрес ячейки оперативной памяти, который обеспечивает прямой доступ к памяти емкостью 1 Мбайт. По сигналам из блока управления оперативная память либо принимает информацию, либо выдает в процессор по шине данных.
Все операнды команд обрабатываются арифметическо-логическим устройством по сигналам устройства микропрограммного управления.
Программно – доступными являются регистры общего назначения (РОН), сегментные регистры, регистр флагов и указатель команд.
Программная модель процессора 8086
Программная модель процессора отображает те блоки и устройства архитектуры процессора, к которым пользователь может обратиться по какой-либо команде.
В этом смысле слова, архитектура процессора представляет собой набор из четырнадцати основных внутренних регистров.
Регистр - это элементарное устройство способное принимать, хранить, преобразовывать и выдавать на внутреннюю шину двоичные данные. Все регистры процессора 16 разрядные. Один разряд хранит один бит информации.
Каждый из регистров имеет собственное имя, которое указывается в команде обращения к регистру. По назначению и способу использования регистры можно разбить на следующие группы:
· регистры общего назначения (АХ, ВХ, СХ, DХ);
· регистры указателей и индексов (SI, DI, BP, SP);
· сегментные регистры (CS, DS, SS, ES);
· указатель команд (IP);
· регистр (или указатель) флагов (EF).
Регистры общего назначения
Особенностью всех этих регистров (рисунок 2.2) является то, что их можно использовать в любых арифметических, логических и других операциях, но в то же время каждый из этих регистров имеет определенную специализацию.
Например команды умножения и деления требуют, чтобы первый операнд (множимое или делимое) непременно находился в регистре АL или AХ или регистрах DX:AX.
16–разрядные регистры AX, BX, CX, DX образованны из 8- битовых регистров AL, AH, BL, BH, CL, CH, DL, DH. Буквы L и H означают младшие (low-order) и старшие (high-order) байты 16-битовых регистров. К каждому из этих байтовых регистров можно обратиться по определённой команде.
15 8 7 0 ← номера разрядов в регистрах | ||||
AX BX CX DX | AH | AL | Аккумулятор –(accumulator) | |
BH | BL | Базовый регистр –(base) | ||
CH | CL | Счётчик – (counter) | ||
DH | DL | Регистр данных – (date) | ||
Рисунок 2.2− Регистры общего назначения |
Регистр АХ − размером в два байта (16 бит), основной регистр процессора, используется при всех арифметических и логических операциях над словами, в операциях ввода, вывода и сдвига. В операциях умножения в этом регистре хранится множимое, а в операциях деления − делимое.
· Регистр ВХ – размером в два байта (16 бит), базовый регистр, используется при арифметических операциях, а также для адресации данных в памяти.
· Регистр СХ – размером в два байта (16 бит), счётчик, используется как счётчик числа повторений одной или нескольких команд, а также при арифметических операциях. Регистр СL - используется как счётчик при операциях сдвига и циклического сдвига на несколько битов.
· Регистр DX - размером в два байта (16 бит), регистр данных, используется при умножении и делении слов и в операциях ввода–вывода для хранения адреса выводимого текста или самого текста.
Регистры указателей и индексов
Эти регистры (рисунок 2.3) можно использовать в любых арифметических, логических и прочих машинных операциях. В то же время каждый из этих регистров имеет определённую специализацию.
15 0 номера разрядов в регистрах | |
SI | Индекс источника –(source index) Индекс приемника – (destination index) Указатель базы –(base pointer) Указатель стека – (stack pointer) |
DI | |
BP | |
SP | |
Рисунок 2.3− Регистры указателей и индексов |
· Регистры SI и DI в совокупности с BP и BX можно использовать для изменения (модификации) адресов памяти в командах пересылки и сравнения.
· Регистр SР используется для работы со стеком. В этом регистре хранится адрес вершины стека.
· Регистр BP используется для модификации адресов ячеек стека.
Стек – это область (сегмент) основной памяти, ячейки в котором адресуются специальным образом. Легче всего представить стек в виде стопки листов бумаги (это одно из значений слова «stack» в английском языке) − вы можете класть и забирать листы только с вершины стопки. Поэтому если записать в стек числа 1, 2, 3 (на одном листе бумаги – одна цифра), то извлекутся они в обратном порядке − 3, 2, 1.
Стек используется для временного хранения содержимого регистров и любых словных (двухбайтовых) переменных, сохранения адреса возврата при вызове процедур, передачи параметров вызываемым подпрограммам и пр.
Стек располагается в сегменте памяти, описываемом регистром SS, а текущее смещение (относительный адрес) ячейки вершины стека хранится в регистре SP. Причем во время записи значение этого смещения уменьшается, то есть он «растет вниз» от максимально возможного адреса.
При вызове подпрограммы или процедуры параметры основной программы помещаются в стек, а в регистр ВР записывают текущее значение регистра SP. Если подпрограмма использует стек для хранения локальных переменных, то SP изменится, но ВР можно будет использовать для того, чтобы считывать значения параметров напрямую из стека (их смещения запишутся как ВР + номер параметра или смещение ячейки в стеке).
Регистры SI, DI, BP, SP не разделены пополам, поэтому к ним можно обращаться только как к 16-разрядным структурам.
Сегментные регистры
ЭВМ на базе микропроцессоров INTEL x86 используют в основном сегментированные модели памяти. В этом случае программы и данные хранятся в отдельных областях основной памяти – сегментах, размер которых колеблется от 16 байт до 65536 байт.
Каждый сегмент имеет адрес расположения в памяти. Этот адрес 16-битный и хранится в сегментном регистре (рисунок 2.4). Поэтому для формирования физического адреса байта в памяти нужны два числа – адрес начала сегмента и смещение искомого байта относительно начала сегмента.
15 0 номера разрядов в регистрах | |
CS | Сегмент кода– (code segment) |
DS | Сегмент данных – (data segment) |
SS | Сегмент стека –(stack segment) |
ES | Дополнительный сегмент – (extra segment) |
Рисунок 2.4 - Регистры сегментов памяти |
Четыре сегментных регистра процессора хранят четыре начальных адреса различных сегментов.
· Регистр сегмента CS – (code segment) хранит адрес сегмента кода текущей исполняемой программы.
· Регистр сегмента DS – (date segment) хранит адрес текущего сегмента данных программы.
· Регистр сегмента SS – (stack segment) хранит адрес сегмента стека.
· Регистр сегмента ES – (extra segment) хранит адрес сегмента текущего дополнительного сегмента, который используется для работы над строками или хранения данных и программ.
Указатель команд IP
Регистр IP – (instruction pointer) 16 битный регистр. В этом регистре находится относительный адрес команды, которая должна быть выполнена процессором следующей за исполняемой.
Содержимое IP изменяется после дешифрации очередной команды, на величину равную количеству байт, отведенных в памяти для хранения этой команды.
Исполнительный (физический) адрес команды (АЕ) определяется с помощью регистров CS и IP следующим образом:
АЕ = CS × 10Н + IP.
Содержимое регистра CS указывает адрес сегмента в памяти, а содержимое IP – смещение команды в этом сегменте. Для увеличения размера адресуемой памяти регистр CS умножается на 16 в десятичной или 10 в шестнадцатиричной системе счисления.
Из формулы видно, что изменение содержимого регистра IP приводит к переходу на другую команду, а изменение содержимого CS означает переход в другую программу или область памяти. Поэтому содержимое CS изменять не рекомендуется. Так как регистр IP 16-разрядный, то максимальное число, хранимое этим регистром, составляет 65535 в десятичной системе и FFFF в шестнадцатиричной. Следовательно, максимальный размер сегмента команд составляет 65536 байт.
Регистр флагов EF
Регистр флагов EF (flags pointer) (рисунок 2.5).Специальный шестнадцатиразрядный регистр, у которого каждый разряд - это флаг, то есть указатель, принимающий значение 1 (флаг установлен) или значение 0 (флаг сброшен), в зависимости от результата операции.
15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
OF | DF | IF | TF | SF | ZF | AF | X | PF | CF |
Рисунок 2.5 − Регистр флагов
В процессоре 8086 используется 9 разрядов регистра. Шесть из них называют флагами состояний и три флагами управления.
Флаги состояний
Флаги состояния устанавливаются многими командами процессора и используются программами для определения последующих действий. Хотя флаги имеют общую функцию, точный смысл и значение каждого флага зависит от результата последней выполненной арифметической команды.
· CF (Carry flag) – флаг переноса. Устанавливается в 1, если есть перенос из старшего разряда регистра или требуется заём значения разряда (при вычитании), в противном случае – в 0.
· PF (parity flag) – флаг четности. Устанавливается в 1, если младший байт результата предыдущей команды содержит четноечисло бит,равных 1, и в 0 - ecли нечетное.
· AF (Auxiliary carry flag) – флаг вспомогательного переноса. Устанавливается в 1, если в результате предыдущей операции произошел перенос (или заем) из третьего разряда в четвертый. Этот флаг используется автоматически командами двоично-десятичной коррекции.
· ZF (Zero flag) – флаг нуля. Устанавливается в 1, если результат предыдущей команды равен нулю.
· SF (Sign flag) – флаг знака. Он всегда равен старшему биту результата.
· ОF (overflow flag) – флаг переполнения. Он устанавливается в 1, если результат предыдущей арифметической операции превысит одно - или двухбайтовый диапазон для чисел со знаком. Например, если при сложении двух положительных чисел получается число, у которого старший бит равен единице, то есть отрицательное, и наоборот.
Флаги управления
· TF (Trap flag) – флаг ловушки. Он был предусмотрен для работы отладчиков, не использующих защищенный режим. Установка его в 1 приводит к тому, что после выполнения одной команды программы управление временно передается отладчику программ.
· IF (Interrupt flag) – флаг прерывании. Сброс этого флага в 0 приводит к тому, что процессор не воспринимает прерывания от внешних устройств (описание команды INT). Обычно его сбрасывают на короткое время для выполнения критических участков программ.
· DF (Direction flag) – флаг направления. Контролирует поведение команд обработки строк. Когда он установлен в 1, индексные регистры, адресующие источник и приемник, после выполнения команды, уменьшаются на единицу. Это означает, что строки обрабатываются в сторону уменьшения адресов. Когда DF = 0, индексные регистры увеличиваются на единицу, и строки обрабатываются от старших адресов к младшим.
Представление данных в ЭВМ
Вся информация, обрабатываемая процессором, представлена в двоичном коде. Так как двоичная система счисления относится к позиционным системам, то вес (значение) цифры в двоичном числе зависит от её положения в числе. Основание двоичной системы равно 2, поэтому и веса соседних цифр в числе будут разниться в два раза. Вес первой цифры в числе равен 1(20), второй -2(21), третьей - 4(22), четвертой -8(23) и т.д.
Один двоичный разряд - 0 либо 1, обычно называют битом, это минимальная единица информации.
Набор из восьми бит – байтом. 10110101 – один байт.
Два байта – слово.
Четыре байта – двойное слово.
Восемь байт – учетверённое слово.
Более компактную форму записи двоичных чисел обеспечивает шестнадцатиричная система счисления, в которой каждая цифра кодируется четырьмя двоичными битами. Для написания чисел в шестнадцатиричной системе используют 10 цифр десятичной системы и шесть букв латинского алфавита – от A до F. Каждая щестнадцатиричная цифра имеет свой вес, кратный 16, следовательно вес любой цифры в числе в 16 раз больше соседней справа цифры. Таким образом, крайняя правая цифра имеет вес равный 1 (160), следующая 16 (161) и т.д. В таблице 2.1 приведены цифры десятичной системы счисления и их шестнадцатиричной и двоичные эквиваленты.
Исходя из принятой системы кодирования, десятичное число 234 будет соответствовать шестнадцатиричному числу ЕАН и двоичному числу 11101010В.
Заметим, что буква Н в числе ЕА означает шестнадцатиричное число, а буква В в двоичном числе – признак двоичной системы.
Задание данных в операторах исходной программы
Ассемблер позволяет вводить данные в следующих формах:
1. Двоичной – последовательность из цифр 0 и 1, заканчивающаяся
буквой В, например 1010110011В.
2. Восьмеричной – последовательность из цифр от 0 до 7, которая
заканчивается буквой G, например 126G.
3. Десятичной – последовательность из цифр от 0 до 9, которая может
заканчиваться буквой D, например 129D или просто 129.
4. Шестнадцатиричной – последовательность из цифр от 0 до 9 и букв
от A до F, заканчивающаяся буквой H. Первым символом числа должна быть цифра, например 0Е35Н. В этом случае 0 информирует ассемблер о том, что Е35Н – число, а не идентификатор.
5. Литералах – строк букв, цифр и других символов, заключённых в
кавычки или апострофы и заканчивающаяся знаком $.
6. Отрицательных числах. Эти числа представлены в специальным
дополнительным кодом.
Таблица 2.1- Представление цифр в различных системах счисления
Десятичное число | Двоичный эквивалент | 16–й эквивалент | Десятичное число | Двоичный эквивалент | 16–й эквивалент |
B | |||||
C | |||||
D | |||||
E | |||||
F | |||||
1D | |||||
A |
Представление и запись отрицательных чисел
Отрицательные числа в ассемблере задаются по следующим правилам:
· если число десятичное, то перед ним достаточно поставить знак минус (-32);
· если число двоичное или шестнадцатиричное, то его записывают в дополнительном коде.
· Во время трансляции программы, все числа перекодируются и записываются в память ЭВМ в двоичном коде.
В общем виде данные представляется беззнаковым, числом равным
2к - |х|,
где к – количество разрядов в ячейке, отведённой под число;
х - модуль отрицательного числа.
Например, в ячейке размером в один байт можно представить следующие знаковые числа в дополнительном коде:
десятичное двоичное шестнадцатиричное
в дополнительном коде (-1) = 256 – 1 = 255 = 11111111b = FFh
(-2) = 256 – 2 = 254 = 11111110b = FEh
(-3 ) = 256 – 3 = 253 = 11111101b = FDh
(-126) = 256 – 126 = 130 = 10000010b = 82h
(-127) = 256 – 127 = 129 = 10000001b = 81h
(-128) = 256 – 128 = 128 = 10000000b = 80h
Так как все данные в процессоре компьютера представлены в двоичном коде, то отрицательные числа кодируются дополнительным кодом.
Запись положительных чисел в дополнительном коде совпадает с их обычной прямой записью.
Например: десятичное число плюс 4 – двоичный код 0000 0100
десятичное число минус 4 – инверсный код 1111 1011
плюс единица 0000 0001
дополнительный код 1111 1100
Представление данных в дополнительном коде дает возможность заменить операции вычитания более простыми операциями сложения, что значительно упрощает структуру процессора.
Пример выполнения операции вычитания двух десятичных чисел процессором: 105-56 = 49
(+105) – десятичное 01101001 – его эквивалент в дополнительном коде
(-56) – десятичное 11001000 – его эквивалент в дополнительном коде
(+ 49) результат 00110001 – сумма в двоичном коде.
Идентификаторы данных и команд
Идентификаторы должны соответствовать следующим правилам:
· первый символ должен быть из множества [A – Z, a – z, ];
· следующие символы из множества [A – Z, a – z,0 - 9 ];
· прописные и строчные буквы различаются;
· размер идентификатора не более 32 символа;
· пробелы в идентификаторе не допускаются;
· идентификатор должен быть коротким, но достаточно понятным и простым.
Директивы (псевдооператоры) ассемблера
Ассемблер имеет ряд операторов, которые управляют процессом ассемблирования и формированием листинга программ. Они действуют только в процессе ассемблирования и не генерируют никаких машинных кодов. Это псевдооператоры или директивы ассемблера. С их помощью определяют сегменты и процедуры, дают имена командам и данным, резервируют области памяти. Форматы и краткое описание некоторых из них приведены ниже.
Директивы (псевдооператоры) определения типа данных
Ассемблер определяет типы данных, используемых в команде, двумя способами:
· через указание длины данных при их объявлении;
· по их содержимому.
Формат определения типа данных имеет следующий вид:
[имя] Dn выражение
Имяданным присваивается, если в программе есть ссылки на эти данные.
Dn -тип переменной который определяется следующими директивами:
· DB– определить тип данных как байты (8 бит). Один байт хранит две десятичные или шестнадцатиричные цифры.
Например, Tabb db 23,45; строка из двух байт
Hex db 35h,6Fh; строка из двух байт
Prt db ‘Привет коллега!$; строка символов.
ЗдесьTabb, Hex, Prt - имена переменных.
· DW – определить тип данных как слово (два байта).
Например, tabw dw 1А23Н,45ЕВН; строка слов.
· DD – определить тип данных как двойное слово ( четыре байта).
Например, tabd dd 45567785.
· DF – определить тип данных как шестибайтовое поле.
Например, tabf df 455677858700.
Здесь tabw, tabd, tabf также являются именами переменных.
· DQ – определить тип данных как восьмибайтовое поле.
· DT – определить тип данных как десятибайтовое поле.
· DUP – директива повторения операнда.
Например, Т1 DB 9 DUP (06),15,47; Т1 – имя (идентификатор),
DB –тип данных,9 – количество повторений числа 06.
Выражение может содержать константу или несколько констант, разделенных запятыми и ограниченных длиной строки. Например,
TABDB DB 45,32,78,09,55,39; ассемблер определяет в памяти эти константы как последовательность смежных байт. Ссылка по имени TABDB указывает на первую константу (45), по имени TABDB +1 – на вторую (32) и т.д.
· EQUи=эти директивы не определяют данные, а позволяют присвоить выражению символическое имя(идентификатор). Выражение может быть 16-битовой константой, ссылкой на адрес, символическим именем, меткой команды, операндом, символом. После присваивания имени выражению можно использовать это имя всюду, где требуется указать это выражение.
Например, К EQU 1024; присвоить имя К константе 1024.
Tadr EQU DS:[BP] [SP]; присвоить имя Tadr комбинации адресов.
Count EQU CX; присвоить имя регистру.
К2 = 24; присвоить имя К2 константе 24.
Директивы изменения атрибутов
Эти директивы (таблица 2.2) позволяют изменить у операнда атрибут типа (BYTE, WORD, DWORD) или атрибут дистанции(SHORT, NEAER или FAR). Ими можно воспользоваться для доступа к байтам в строках слов, или наоборот, к словам в строке байт.
Например, имеем строку десятичных слов:
TW DW 4564,6781,1234
Требуется изменить содержимое третьего байта (67) в этой строке на число 99.
Выполним команду Mov BYTE PTR TW +3, 99
После выполнения команды строка примет следующий вид:
TW DW 4567, 9981, 1234
Таблица 2.2–Директивы присваивания атрибутов данным
PTR SHORT | Формат: типPTR выражение; изменяет атрибуты типа данных. Тип – новый атрибут, выражение- идентификатор, чей атрибут должен быть изменён. В качестве типаданных используются имена - BYTE, WORD, DWORD, QWORD, TBYTE. Формат: JMP SHORT метка; изменяет атрибут метки NEAR команды перехода JMP и указывает, что переход осуществляется на расстояние не более чем на -128 или +127 байт. |
Директивы возвращающие значения операндов
Наиболее распространены директивы offset и $.
Директива offset применяется в тех случаях, когда необходимо занести в регистр адрес данных, а не сами данные. Например, команда
Mov AX,offset TW
заносит в регистр АХ адрес таблицы слов TW.
Директива $ ставится в конце строки символов. Её присутствие обязательно, так как она определяет количество выводимых символов. Директива, как и символ, заключается в кавычки.
Директивы задания набора команд
По умолчанию ассемблеры используют набор команд процессора 8086. Для того чтобы ассемблер разрешил использование команд более поздних версий процессоров и команд расширений, используются следующие директивы:
.386 – разрешены непривилегированные команды МП 80386;
.686 - разрешены непривилегированные команды Р6;
.686p - разрешены все команды Р6 (Pentium Pro).
Формат команд языка ассемблера
В общем виде команды языка ассемблера в исходной программе могут иметь следующие поля:
[метка:] мнемокод команды [операнд1,операнд2] [;комментарий]
Поля команды, указанные в квадратных скобках, не обязательны. Поле операндов имеется только в тех командах, которым требуется операнды. Поля должны быть разделены хотя бы одним знаком пробела. Пример типичной команды:
METKA1: MOV AX,BX; Двухоперандная команда пересылки данных из
регистра ВХ в регистр АХ. После выполнения
команды содержимое обоих регистров будет
одинаково.
Поле метки (METKA1) служит для присваивания имени команде. На это имя могут затем ссылаться другие команды программы. Поле может содержать до 31 символа и должно заканчиваться двоеточием (:).
Поле мнемокода (MOV) содержит мнемоническое изображение команды или инструкции, которое определяет действия процессора.
Поле операндов (AX,BX)содержит сведения о местонахождении данных, подлежащих обработке. Данные могут находиться в регистрах, памяти или непосредственно в команде. Если операндов больше одного, то они разделяются запятой. Пробел не обязателен. Большинство команд двухоперандные и имеют формат вида:
КОМАНДА приемник, источник
Так выглядят все команды пересылки, когда пересылается второй операнд в первый, команды сложения и вычитания, когда процессор читает содержимое источника, выполняет некоторую операцию с привлечением первого операнда и сохраняет результат в первом операнде. Ассемблер оперирует также безоперандными командами; в этом случае операнд подразумевается кодом самой команды.
Поле комментариев − это необязательное поле, в котором можно описывать команды программы и их роль в программе. Это поле не транслируется и должно отделяться от поля операнда точкой с запятой (;).
Команды процессора МП 8086 могут занимать в памяти от 1 до 6 байт, формат команд показан на рисунке 2.6.
7 1 0 7 6 5 3 2 0
COP | D | W | MOD | REG | R/M | DISP 8/16 | DATA 8/16 |
Рисунок 2.6– Формат команды МП 8086
В первом байте содержится код операции (в некоторых случаях он может размещаться и во втором байте).
Одноразрядное поле W служит указателем разрядности (при W = 0 операнды 8-разрядные, а при W=1 операнды 16-разрядные).
Поле D указывает, в какой из двух регистров заносится результат операции. Если D=0, то результат в регистре приемнике, если D=1, то результат в регистре источнике.
Двоичный код поля REG указывает регистр, в котором находится операнд. В таблице 2.3 показано соответствие значений поля REG и местонахождение операндов.
Таблица 2.3 −Местонахождение операндов согласно коду поля REG
REG | W=1 | W=0 | REG | W=1 | W=0 |
AX | AL | SP | AH | ||
CX | CL | BP | CH | ||
DX | DL | SI | DH | ||
BX | BL | DI | BH |
Поля MOD и R/M второго байта команды определяют один из 24 режимов формирования относительного адреса операнда в сегменте данных или стека.
Смещение в команде (приращение относительного адреса операнда) определяют соответственно поля DISP8 и DISP16. Смещение может быть восемь или шестнадцать бит.
Поле R/M при коде MOD, равном 11, и поле REG определяют содержимое РОН.
В полях DATA8 или DATA 16 находятся одно или двухбайтовые непосредственные данные.