Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Архитектура ВС-пособие.docx
Скачиваний:
2
Добавлен:
01.05.2025
Размер:
728.99 Кб
Скачать

Лекция 9. Структура машинной команды.

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

Оператором (строкой) исходной программы может быть или команда, или (директива) Ассемблера.

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

Команда (по [Максимов,Партыка,Попов,2006,с.460]) (instruction ) - описание элементарной операции, которую должен выполнить процессор. Обычно содержит код выполняемой операции, указания по определению операндов (или их адресов), указания по размещению получаемого результата.

Основной формат кодирования команд ассемблера имеет следующий вид:

Пример:

Метка Команда Операнд Комментарий

COUNT DB 1 ;Имя, команда, один операнд

MOV AX,0 ;Команда, два операнда

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

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

Буквы: от A до Z и от a до z

Цифры: от 0 до 9

Спецсимволы: (?), (.) (только первый символ), (@), (_), ($)

Первым символом в метке должна быть буква или спецсимвол. Ассемблер не делает различия между заглавными и строчными буквами. Максимальная длина метки - 31 символ. Примеры меток: PAGE25, $E10. Рекомендуется использовать описательные и смысловые метки.

Код операции (КОП) - это мнемонические обозначения соответствующей машинной команды. 

Операнды[Юров,2002,с.90].  - это  программные объекты  (числа, регистры или ячейки памяти), на которые действуют команды или директивы, либо это объекты, которые определяют или уточняют действие команд или директив.

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

  • двоичной, как последовательность цифр 0 и 1 , заканчивающихся буквой В, например, 10111010В;

  • десятичной (в привычной десятичной системе счисления с необязательной буквой D на конце), например, 129D или просто 129;

  • шестнадцатеричной, как последовательность цифр от 0 до 9 и букв от А до F, заканчивающаяся буквой Н. Первым символом может быть только цифра от 0 до 9, например, 0Е23Н;

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

Операнды команды могут задаваться по-разному:

1) неявно на микропроцессорном уровне. Такие команды работают либо с регистрами, либо с флагами и в конкретной команде объект определяется кодом команды, например:

pushf - команда пересылки флагов в стек. Источник (откуда берутся данные) и приемник (куда пересылаются) определяются кодом команды;

cld - обнуление флага направления DF;

2) явно в самой команде (непосредственный операнд), например:

mov ах, 0;

3) одним из регистров общего назначения (РОН) или сегментным регистром;

add al,dl ;команда с регистровыми операндами

4) идентификатором переменной (меткой переменной, описанной в сегменте данных). В этом случае операнд располагается в ОЗУ. При косвенной адресации адрес-смещение переменной в ОЗУ помещается в РОН или индексный регистр и в команде используется ссылка на этот регистр;

data segment

mas_w dw 25 dup (0)

code segment

lea si,mas_w

5) номером порта ввода-вывода. В этом случае номер задается шестнадцатеричной константой;

in al,60h ;ввести байт из порта 60h

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

Важной особенностью машинных команд является то, что они не могут манипулировать одновременно 2-мя операндами, находящимися в ОЗУ. Это означает, что в команде только 1 операнд может указывать на ячейку ОЗУ, 2- должен быть либо регистром, либо непосредственно указывать значение. По этой причине возможны следующие сочетания операндов в команде:

регистр - регистр;

регистр - память;

память - регистр;

регистр - непосредственный операнд;

память - непосредственный операнд.

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

Местонахождение операнда команды определяет его адрес в памяти, который называется  исполнительным адресом операнда.

По количеству записываемых адресов (обозначаются а1, а2, а3,...) команды делят на безадресные, одно-, двух- и трехадресные.

Приведём типовые структуры команд:

(а)  трёхадресная команда;

(б)  двухадресная команда;

(б)  двухадресная команда;

результат

Замечания (важные).

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

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

(в)  одноадресная команда;

Замечание.

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

(г)  безадресная команда;

Код операции

  Информация для неё должна быть заранее помещена в определённые регистры машины.

  Команда Операнд Комментарий

Нет операндов RET ;Вернуться

Один операнд INC CX ;Увеличить CX

Два операнда ADD AX,12 ;Прибавить 12 к AX

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

Директивы

Директивы ([Юров,2002,с.76])  - конструкции, которые не генерируют машинных команд, а являются указаниями компилятору на выполнение некоторых действий или служат для задания его работы. Другими словами,  директивы  [Ирвин,2002,с.71] - утверждения для информирования компилятора языка ассемблера о том, как создавать выполняемый код. У директив нет аналогов в машинном представлении.

Синтаксис директив следующий:

Как видно, формат директив в целом совпадает с форматом команд. Но в отличие от команд, в директиве после имени не ставится двоеточие.

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

К директивам ассемблера относятся обозначения начала и конца сегментов segment и ends; ключевые слова, описывающие тип используемых данных (db, dw,dd, dup); специальные описатели сегментов вроде stack и т.д.

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