Автоматизация

Вид материалаДокументы

Содержание


Адресация через регистры общего назначения RO—R6
Автоинкрементную косвенную
Автодекрементная косвенная адресация
Индексную косвенную
Адресация через счетчик команд
Непосредственная адресация
Абсолютная адресация
Относительная адресация
Относительная косвенная адресация
Основные директивы АССЕМБЛЕРа
Ascii /end of data/
Sy: .ascii/s/
Rad50 /abc/
Составление текста программы
Mcall .exit
Jmp label
Massiv: .blkw 100
Cmp ro, #massiv+200
Massiv: .blkw 100
Ascii: .blkb 64
...
Полное содержание
Подобный материал:
1   ...   9   10   11   12   13   14   15   16   ...   25
§ 5.3 СПОСОБЫ АДРЕСАЦИИ.


Архитектура команд ЭВМ СМ-4 предусматривает использова­ние свыше 70, а с учетом модификаций для побайтовой адреса­ции — свыше 90 команд. Большая часть этих команд используется также и в ЭВМ «Электроника-60».

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

Команда CLR (очистка) «стирает» операнд, т. е. записывает на его место 0.

Команда INC (инкремент) увеличивает операнд на 1. - Указанные команды относятся к классу однооперандных или одноадресных, так как по своему смыслу они воздействуют только на один операнд. Многие команды должны работать с двумя операндами. Один из них называют источником, другой — прием­ником. Приведем примеры таких команд.

Команда MOV (пересылка) передает операнд-источник по адресу операнда-приемника, например содержимое одного регистра в другой либо содержимое регистра в ячейку памяти. При этом операнд-источник не изменяется.

Команда ADD (сложение) прибавляет операнд-источник к операнду-приемнику и отправляет полученную сумму по адресу операнда-приемника. При этом операнд-источник не изменяется.

Собственно команда (оператор предложения АССЕМБЛЕРа) указывает только характер действия, которое надо выполнить над операндами. Местонахождение операндов (а они могут содержаться либо в РОН, либо в ячейках оперативной памяти) указывается с помощью адреса, входящего в полный код команды.Адрес может задаваться различными способами.

Всего существует 12 различных способов адресации. Первые

восемь из них в процессе обращения к операндам используют РОН с RO no R6. Какой именно регистр использовать для поиска операнда, определяет программист, указывая мнемоническое обозначение выбранного регистра (RO, R1 и т. д.) в программной строке.


Адресация через регистры общего назначения RO—R6

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

Примеры команд с использованием прямой адресации:

INC RA2 ; увеличить содержимое R2 на 1

MOV Rl, R3 " ; переслать содержимое R1 в R3.


Задача 5.1. Поменять содержимое регистров RO и R1.

Для решения задачи надо воспользоваться вспомогательным регистром, на­пример R4:

MOV RO, R4

MOV Rl, RO

MOV R4, R1


Задача 5.2 Сложить содержимое регистров R1,R2,R3. Сумму занести в R5:

Проще всего выполнить последовательное сложение прямо в R5.

MOV Rl, R5

ADD R2, R5

ADD R3, R5

Задача 5.3 Увеличить содержимое R1 на два.

INC R1

INC R1


Задача 5.4. Удвоить содержимое RO ADD R0,RO

Косвенная адресация предполагает наличие в регистре адреса операнда, т. е. номера ячейки оперативной памяти (слова или байта), в которой находится операнд. Мнемоническое обозначение (Rn) или @Rn,

В приведенных ниже примерах на косвенную адресацию пред­полагается, что в регистре R2 находится число 1000, а в регистре R3 — число 250:

CLR (R2) ; очистить ячейку с адресом 1000

MOV(R3), (R2) ; перенести содержимое ячейки с адресом

; 250 в ячейку с адресом 1000


Задача 5.5 В регистре RO находится адрес начала массива, а в регистре

R1- номер нужного элемента. Увеличить этот элемент массива на еденицу.

Поскольку порядковые номера присваиваются байтам, а каждое слово содер-жит два байта, адреса слов увеличиваются через 2. При этом 0-й элемент от начала массива имеет смещение 0, 1-й элемент — смещение 2, 2-й элемент смещение 4 и т д. Поэтому для вычесления смещения порядковый номер элемента надо умножить на 2, что можно сделать, сложив содержимое регистра R1 с самим собой. При этом предпологается, что элементы массива нумеруются от нуля:

ADD Rl, Rl ; вычисление смещения

ADD Rl, RO ; вычисление адреса

INC (RO) ; инкремент элемента

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

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

Пример на автоинкрементную адресацию (в R1 находится число 1000):

CLR (Rl)+ ; очистить слово с адресом 1000. После выпол-

; нения команды в регистре R1 адрес 1002

Задача 5.6. Очистить три последовательные ячейки памяти. Адрес первой находится в R1:

CLR (Rl)+

CLR (Rl)+

CLR (Rl)

При автодекрементной адресации, как и при автоинкрементной, в регистре находится адрес. Однако изменяется этот адрес не после, а до выполнения операции, при этом адрес не увеличивается, а уменьшается на 2 или 1 в зависимости от типа команды (обращение к слову или байту). Мнемоническое обозначение —(Rn). Пример на автодекрементную адресацию (в R1 находится число 166):

INC—(R1) - увеличить на единицу содержимое ячейки с адресом 164. После выполнения команды в регистре R1 адрес 164


Автоинкрементную косвенную адресацию можно назвать двой­ной косвенной, поскольку в регистре указывается адрес ячейки, в которой, в свою очередь, записан адрес ячейки с операндом. Инкрементность адресации заключается в том, что после выполнения команды содержимое регистра увеличивается на 2. Мнемоническое обозначение @(Rn)+.

Рассмотрим действие автоинкрементной косвенной адресации (рис. 5.5). Пусть в регистре R2 содержится число 102. Оно рассмат­ривается как адрес ячейки памяти, однако по адресу 102 располо­жен не операнд, а адрес операнда. Если в ячейке с адресом 102 содержится число 200, то операнд находится по адресу 200. После выполнения команды содержимое R2 увеличится на 2 и станет равным 104 (ожидается, что по адресу 104 находится следующий операнд или его адрес).

Пример на автоинкрементную косвенную адресацию (содер­жимое регистров и ячеек взято из рис. 5. 5):

CLR@(R2)+ - очищается ячейка с адресом 200

Важность автоинкрементной косвенной адресации определяется тем, что во многих случаях в программах удобно работать с массивами адресов (числа 400, 200 и 260 на рис. 5.5). Автоинкре­ментная косвенная адресация дает удобную возможность работы с операндами, если их адреса расположены в последовательных ячейках.

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





Рис. 5.5 Действие автоинкрементной Рис.5.6 Действие индексной адресации.

косвенной адресации.


Пример команды для содержимого регистров и ячеек из рис. 5.5:

CLR@ — (R2) ; очистка ячейки по адресу 400

Индексная адресация используется прежде всего для работы с массивами операндов. Мнемоническое обозначение -E(Rn), где Е — выражение (подробнее о выражениях см. § 5.4). Чаще всего Е представляет собой символическое обозначение метки. Адрес операнда определяется как сумма содержимого регистра Rn и значения Е.

Пусть метка МА относится к началу массива данных (рис. 5.6). Тогда следующие за МА слова имеют адреса МА+2, МА+4, МА+6 и т. д. Если заносить в какой-либо из регистров общего назначения этот «добавок» к значению МА и использовать этот регистр для индексной адресации, то можно будет обращаться к любым элементам массива. Если (как это показано на рис. 5.6) в R5 находится число 4, то команда CLR MA(R5) очистит ячейку с адресом МА+4.

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


Задача 5.7 Увеличить на еденицу все элементы массива из 100 слов, начинающихся с метки ММ.

CLR R2 ;подготовка (очистка) индексного регистра

PP: INC MM(R2) ; содержательная строка цикла

INC R2 ; изменение

INC R2 ;индекса элемента

; переход на метку PP, если содержимое R2 < 200

В рассмотренных примерах использованная метка характеризо­вала адрес начала массива («базовый» адрес), а в регистре нахо­дилось смещение относительно этой базы. Иногда удобно хранить базовый адрес в регистре. Тогда в символическом обозначении команды используют не метку, а абсолютное значение смещения.

Если, например, в регистр R2 помещен адрес 164000, то команда CLR(R2) очистит слово с адресом 164000, команда INC 2(R2) до­бавит единицу к содержимому слова с адресом 164002, а команда CLR 4(R2) очистит слово с адресом 164004.

I Индексную косвенную адресацию можно использовать, наприvep, для работы с массивами адресов. Мнемоническое обозначение @E(Rn). Здесь адрес вычисляется так же, как и в предыдущем случае (сумма значения Е и содержимого регистра), но это не адрес операнда,а адрес адреса операнда. Команда занимает в па­мяти два слова; во втором слове хранится значение Е.


Адресация через счетчик команд

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

Непосредственная адресация предназначена для работы с опе­рандом, входящим непосредственно в символическую запись ко­манды. Мнемоническое обозначение #Е, где Е — выражение, являющееся операндом. Чаще всего Е представляет собой просто число или символическое обозначение метки. В последнем случае опе­рандом является значение этой метки, т. е. адрес соответствующей ячейки. Команда занимает два слова. В первом содержится код Команды, во втором — операнд. Примеры команд:

MOV #15,R3 ;загрузка числа 15 в R3

MOV #PARM,R2 ; загрузка адреса PARM в R2


Задача 5.8 Метка SPECTR характеризует начало массива. Определить адрес 126-го элементаи занести его в R0.

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

MOV #126, RO ; в R0-адрес элемента

ADD R0,R0 ; в R0- смещение к элементу

ADD #SPECTR,R0 ; прибавить к смещению базовый адрес


Абсолютная адресация используется для обращения по адресам, значения которых фиксированы и известны заранее. Чаще всего это адреса ячеек системных областей памяти и регистров внешних устройств. Мнемоническое обозначение @#Е, где Е — выражение, вычисление которого дает абсолютный адрес. Команда занимает два слова памяти. Во второе слово транслятором заносится ука­занный в команде абсолютный адрес.

Пример команды:

MOV @#52, R3 ; переслать в R3 содержимое ячейки

; с абсолютным адресом 52

Относительная адресация позволяет обращаться к ячейкам по присвоенным им меткам. Мнемоническое обозначение Е. Значение выражения Е является адресом операнда. Команда занимает два слова памяти, при этом во втором слове записывается смещение к указанному в команде адресу. Это смещение вычисляется относи­тельно адреса следующей команды.

Задача 5.9 Поменять местами содержимое ячеек X,Y:

MOV X, RO

MOV Y..X

MOV RO, Y


Относительная косвенная адресация является косвенной по отношению к предыдущей. Структура кода команды и метод вычис­ления адреса такие же, но полученный адрес есть не адрес операн­да, а адрес адреса операнда. Мнемоническое обозначение @Е.

Пример:

CLR @LL ; очистка ячейки, адрес которой находится в ячейке

; с меткой LL

В табл. П5 и П6 сведены все способы адресации вместе с мнемоникой и кратким описанием.


§ 5.4. ДИРЕКТИВЫ И КОМАНДЫ


Элементы предложений АССЕМБЛЕРа

В примерах и задачах § 5.3 использовались такие элементы предложений АССЕМБЛЕРа, как мнемонические обозначения ко­манд и регистров, условные обозначения способов адресации, а также целые восьмеричные числа. В действительности при написа­нии программы можно пользоваться более широким набором эле­ментов (некоторые из них рассмотрены ниже).

Одноместные и двухместные операторы. Одноместным называют оператор, действующий на один операнд, записанный непосредст­венно за ним. Имеется три таких оператора: + (знак плюс; чаще всего он опускается), — (знак минус) и —i (универсальный одно­местный оператор; может обозначаться знаком ).

Одноместный оператор минус изменяет знак стоящего за ним выражения.

Знак —i в сочетании с определенными символами выполняет над операндом некоторые специфические действия. Например, -iС24 обозначает обратный код восьмеричного числа 24; -iD100 трактует число 100 как десятичное, a -iBlOO — как двоичное (дру­гой способ обозначения десятичного числа простановка после него точки: 100., 999.).

Двухместные операторы связывают два операнда, между кото­рыми они записаны. Имеется шесть таких операторов: + (знак сложения), — (знак вычитания), с (знак умножения), / (знак деления), & (логическое И), ! (логическое ИЛИ). Если в одном выражении встречаются несколько таких операторов, они выполня­ются слева направо и не имеют никакого относительного стар­шинства. Так, выражение 2+34 равно 20ю, а не 14ю, как это бы­ло бы по правилам обычной арифметики. Если нужно изменить установленный порядок действия операторов, используют угловые скобки. Например, выражение 2+<3>(<4> равно 14ю. Такие выраже­ния могут использоваться в качестве операндов директив и команд:

MOV #164000+<7*40>+2, RO

В RO записывается число 1643428.

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

CSR= 164000

присваивает CSR значение 1640008, а операция N7Al = CSR+<7*40>+2

присваивает N7A1 значение 164342.

Локальные метки. В сложных программах количество меток может составлять много десятков и даже сотен. В то же время многие метки используются лишь на ограниченных участках программы для организации, например, замкнутых циклов или обхода нескольких строк программы по условию. Для того чтобы сократить количество символических обозначений, в указанных случаях ис­пользуются локальные метки, область действия которых ограничеyа обычными символическими метками. Локальные метки имеют форму n$, где n — десятичное число от 1 до 65535 (локальные метки от 64$ до 127$ генерируются в ряде случаев системой и не рекомендуются для использования). Пример фрагмента про­граммы с использованием локальных меток:

CLR R4

2$: CLR R3

1$: INC R3

CMP R3, #1000

BNE 1$

INC R4

CMP R4, #1000

BNE 2$

BND:

В приведенном фрагменте организован цикл добавления еди­ницы к содержимому R3. Этот цикл вставлен внутрь аналогичного цикла с использованием регистра R4, который отсчитывает 1000 повторений внутреннего цикла, увеличивая свое содержимое на 1 каждый раз после того, как в R3 накопится число 1000. Метка BND, поставленная перед следующей строкой программы, ограни­чивает область действия локальных меток, поэтому следующие строки программы можно снова метить локальными метками 1$: и 2$:.

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

ССС=. ; символическому обозначению ССС присваивается

; значение текущего адреса

MOV #.,RO ; переслать в RO адрес данной команды

.= .+20 ; увеличить содержимое счетчика текущего адреса

; на 20 (т. е. зарезервировать 20 байт).


Основные директивы АССЕМБЛЕРа

Как уже отмечалось ранее, директивы исполняются в процессе трансляции. АССЕМБЛЕР СМ-4 имеет богатый набор директив, управляющих заполнением памяти, состоянием счетчика текущего адреса, секционированием программ, контролем содержания лис­тинга трансляции и т. д. В настоящем разделе рассмотрены дирек­тивы, наиболее часто встречающиеся в прикладных программах.

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

N=-iB 10000

A: .WORD 16

B: .WORD A, N, 7+<М*1000>, 100.

В этом примере в слово с меткой А заносится число 16; в следующее слово (с меткой В) заносится значение метки. А, т. е. адрес предыдущего слова; следующие (непомеченные) слова запол­няются значением N, т. е. двоичным числом 10000, значением выражения 7+(N:4clOOO> и двоичным эквивалентом десятичного числа 100.

Директива .BYTE заполняет Последовательные байты памяти. Значения операндов не должны превышать 3778=255ю и, следова­тельно, не могут быть адресами (значениями меток). Пример ис­пользования директивы .BYTE:

S=165.

.BYTE 377,-iD25,-iB1001,S

Директива .ASCII служит для заполнения памяти текстом (т. е. последовательностью произвольных символов) в коде ASCII.

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

Всегд в коде ASCII имеется 127 различных комбинаций от .0 до 1778. В зависимости от типа используемого терминала (теле­тайп, алфавитно-цифровой дисплей с русским шрифтом или без него и др.) значения отдельных кодов могут меняться. В табл. П7 приведены коды ASCII наиболее употребительных символов. Из таблицы видно, что наряду с символами, имеющими определенное изображение (буквы, цифры, специальные машинные знаки #, @, $ и др.), имеются также служебные коды, служащие, в основном, .для управления аппаратурой ввода-вывода. К ним относятся, на­пример, код 011 (горизонтальная табуляция), 012 (перевод строки), 115 (возврат в начало строки), 177 (стирание введенного символа) и пр. Другие коды с аппаратурой не связаны, но, будучи введены с терминала, заставляют операционную систему выполнить опреде­ленные действия. Например, код 003 отменяет выполняемую программу; код 017 прекращает дальнейшую выдачу сообщения на Терминал и т. д. Большинство управляющих кодов может быть введено с клавиатуры терминала путем одновременного нажатия двух клавиш: клавиши CTRL и какой-либо буквенной клавиши. Например, прекращение выдачи сообщения на терминал достигает­ся нажатием клавиш CTRL/O.

Директива .ASCII преобразует строку символов в соответствую­щие коды ASCII и заполняет ими последовательные байты памяти.

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

.ASCII /END OF DATA/

.ASCII #Z = X/Y#

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

.ASCII<12>

Эта запись полностью эквивалентна следующей:

.BYTE 12

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

.ASCII <12> <15> /***/ <12> <15> /END OF TEXT./




Рис 5.7 Заполнение памяти алфавитно-цифровой информацией в коде ASCII.


На рис. 5.7 показано заполнение памяти для последнего приме­ра. Если организовать вывод на экран терминала содержимого этого участка памяти, будет напечатано следующее сообщение:

***

END OF TEXT.


Часто возникает необходимость использовать коды символов непосредственно в программных строках. Пусть, например, требует­ся определить, содержится ли в регистре R1 код ASCII символа S. Это можно сделать, записав предварительно код символа в память с помощью директивы .ASCII и обращаясь затем по соответству­ющей метке

SY: .ASCII/S/

СМРВ SY, R1; в R1 код символа S?

Чтобы не создавать специальное поле данных с кодом символа, можно определить код по таблице и воспользоваться им в програм­мной строке:

СМРВ #123, R1


Удобнее, однако, воспользоваться специальным одноместным оператором — апострофом '. Этот оператор, написанный перед каким-либо символом, образует его код ASCII:


СМРВ #'S, R1; в R1 код символа S?


Для преобразования в код ASCII строки из двух символов предусмотрен другой оператор — кавычки ":

MOV #"RS, R1

В результате выполнения этой команды в младший байт R1 будет записано число 122 (код ASCII символа R), а в старший байт — число 123 (код символа S).

Следует отчетливо понимать разницу между двоичным пред­ставлением цифры и ее кодом ASCII:


MOV #5,R2 ;R2 число 5

MOV #'5,R2 ; в R2 число 65 (код ASCII цифры 5)

MOV #34,RO ; в RO число 34

MOV #"34,RO ; в младшем байте RO число 63, в старшем —64.


Директива .ASCIZ эквивалентна директиве .ASCII за тем иск­лючением, что строка текста автоматически дополняется нулевым байтом. Это дает возможность легко находить конец текста, не задавая заранее количество символов в строке.

Директива .RAD50 служит, как и директива .ASCII, для записи в память алфавитно:цифровой информации, но не в коде ASCII, а в специальном коде RADIX-50. Если код ASCII служит прежде всего для обмена алфавитно-цифровой информацией с внешними устройствами (печатающими, перфорирующими и т. д.), то код RADIX-50 используется в основном для передачи операционной системе имен используемых в данной программе файлов, подпро­грамм, внешних устройств и другой служебной информации. Эта информация.обычно записывается в поле данных программы поль­зователя и по ходу выполнения программы передается операционной системе посредством системных директив.

В коде RADIX-50 каждое слово памяти может содержать три алфавитно-цифровых символа. Каждый символ (допустимы только латинские буквы, цифры, точка, пробел и знак доллара) имеет определенное числовое значение (см. табл. П8 в приложении). Полный код тройки каких-либо символов Cl, C2 и СЗ образуется путем вычисления выражения ((С1*508)+С2) *508+СЗ: Напри­мер, код RADIX-50 сочетания ABC равен ((С1*50)+2)*50+3=32238. Это число и записывается в память с помощью директивы .RAD50.

Правила записи операндов директивы .RAD50 совпадают с соответствующими правилами для директивы .ASCII:

.RAD50 /ABC/

.RAD50 /DKOFILE42/

Последняя строка заполняет три слова памяти. В них будут содержаться коды сочетаний DKO, FIL и Е42.

Директивы управления счетчиком текущего адреса. Директива .EVEN добавляет единицу в счетчик текущего адреса, если его содержимое было нечетным. Тем самым счетчик смещается на границу целого слова (напомним, что адреса слов могут быть толь­ко четными). Директива .EVEN используется обычно после дирек­тив .ASCII и .ASCIZ для того, чтобы избежать ошибок адресации, в случае если количество символов в строке текста окажется не­четным.

Директива .BLKW резервирует память. Количество резервиру­емых слов записывается в операнде директивы:

A: .BLKW 4 ; начиная с метки А резервируются 4

; слова

В: .BLKW 256 ; начиная с метки В резервируются 25610

; слов

Директива .BLKB резервирует память по байтам:

С: .BLKB 5 ; начиная с метки С, резервируются 5 байт

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

В качестве операнда директивы .END может быть указана входная метка программы, т. е. метка, относящаяся к первой про­граммной строке (не к первой строке данных!). Если загрузоч­ный модуль программы образуется из одного-единственного объект­ного модуля, директива .END, заканчивающая текст исходного модуля, обязательно должна содержать операнд. Он указывает про­цессору, с какой строки надо начать выполнение программы. Если же загрузочный 'модуль программы компонуется из нескольких объектных модулей (и соответственно из нескольких исходных), метка входа указывается только в том модуле, с которого надо начать выполнение программы.


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

АССЕМБЛЕР СМ-4 не накладывает никаких ограничений на взаимное расположение в программе полей данных и программных строк. В принципе, данные могут располагаться в начале про­граммы, перед программными строками, в конце программы, после них либо даже чередоваться с программными строками. Однако про­грамма должна быть составлена таким образом, чтобы процессор выполнял только программные строки, обращаясь к строкам с данными лишь за получением данных.

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

Останов программы после выполнения последней команды осу­ществляется средствами операционной системы, которой надо передать соответствующее указание. Это делается с помощью системных макрокоманд (системных директив). В каждой операци­онной системе имеется своя макрокоманда выхода из выполняемой программы. Например, в операционной системе РАФОС для этого служит макрокоманда .EXIT. Следует подчеркнуть, что хотя по на­чертанию эта макрокоманда аналогична директивам АССЕМБЛЕРа, она является элементом операционной системы и может (и долж­на) использоваться, только если ЭВМ работает под управлением соответствующей операционной системы. В процессе трансляции строка .EXIT преобразуется в последовательность машинных ко­манд, в .результате выполнения которых текущая задача завершает­ся и управление передается операционной системе. В операционной системе ОС РВ тем же целям служит системная директива EXIT$S.

Тексты системных макрокоманд записаны в одной из системных библиотек. Для того чтобы транслятор мог получить доступ к этой библиотеке и извлечь оттуда требуемый текст, имена используемых в данной программе системных макрокоманд надо описать в поле специальной директивы АССЕМБЛЕРа .MCALL. Эта директива должна помещаться, по крайней мере, перед строкой с обращением к макрокоманде. Обычно директива .MCALL составляет первую игроку программы.

Для иллюстрации правил составления текста программы на языке АССЕМБЛЕР приведем программу суммирования двух чисел, расположенных в ячейках А и В, с занесением суммы в ячейку С:

.MCALL .EXIT

A: .WORD 3

В: .WORD 16

С: .BLKW 1

START: MOV A, C

ADD В, С

.EXIT

.END START


Отметим, что данные в этом примере могли бы располагаться между макрокомандой окончания программы .EXIT и директивой окончания трансляции .END.

Команды

Как уже отмечалось, архитектура ЭВМ СМ-4 предусматривает использование свыше 70 арифметических, логических, управля­ющих и прочих команд. Применение многих из них, таких, как MOV, CLR, INC, ADD, не вызывает особых затруднений — их действие очевидно из расшифровки мнемонического обозначения. В других случаях программист должен знать механизм работы команды и особенности ее использования. В приведенном ниже кратком обзоре команд принят функциональный принцип их клас­сификации. При этом некоторые команды, такие, например, как команды перехода на подпрограмму и возврата из нее, команда возврата из прерывания и другие, описываются в следующих разделах по мере изложения соответствующего материала. В табл. П9 приведен более полный перечень команд.

Команды пересылки. Команда MOV (move — пересылка) пере­сылает содержимое источника по адресу приемника. Содержимое источника при этом не изменяется, что позволяет в случае необ­ходимости многократно пересылать одну и ту же величину по раз­ным адресам.

Коды условий N и Z устанавливают при выполнении команды MOV очевидным образом: если пересылается нуль, устанавливается разряд Z, если же в пересылаемом слове установлен старший (знаковый) разряд, устанавливается разряд N. Разряд V всегда сбрасывается, а состояние разряда С командой не изменяется.

Команда MOVB (move byte — пересылка байта) полностью аналогична предыдущей за тем исключением, что пересылает она не слово, а байт. Значительная часть команд СМ-4 имеют варианты для побайтовой адресации. Все они имеют единый принцип по­строения: к мнемоническому обозначению основной команды добав­ляется буква В. Команды, имеющие вариант для побайтовой адре­сации, принято обозначать (в описаниях, таблицах) с буквой В в скобках, например MOV(B), CLR (В), INC (В) и т. д.

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

A: .WORD 177344

В: .WORD 0

MOVB А,В+1 ; содержимое младшего байта слова А (число 344) пересылается в

; старший байт слова В

MOVB А+1,В ; содержимое старшего байта слова А (число 376)

; пересылается в младший байт слова B

WOVB A,R2 ; число 344 пересылается в R2

Команды изменения содержимого. Команда CLR(B) (clear — очистка) очищает адресуемую ячейку, т. е. заносит туда нуль. Команда INC(B) (increment — инкремент) увеличивает операнд на единицу.

Команда DEC (В) (decrement — декремент) уменьшает операнд на единицу.

Команда СОМ(В) (complement — инверсия) выполняет пораз­рядную инверсию: все нули двоичного, представления операнда заменяются единицами и наоборот.

Арифметические команды. Команда ADD (add — сложение) складывает оба операнда и заносит сумму по адресу операнда-приемника.

Команда SUB (subtract — вычитание) вычитает операнд-источник из операнда-приемника и заносит разность по адресу операнда-приемника. Пример команды:


SUB #4, R2


После выполнения содержимое R2 уменьшается на 4. Следует обратить внимание на то, что вычитание производится справа нале­во, но результат записывается по адресу правого операнда.

Команды сравнения и проверки. Команда СМР(В) (compare — сравнение) сравнивает операнды. Сравнение заключается в вычитании операнда-приемника из операнда-источника и установке кодов условий в зависимости от результата операции. Сам резуль­тат вычитания нигде не фиксируется, и операнды не изменяются. Коды условий устанавливаются в соответствии с их обычными функциями. Последующий анализ кодов условий позволяет организовать переходы в программе в зависимости от результата Сравнения. Рассмотрим влияние результата сравнения на установку кодов условий. В команде

CMP Rl,#20


Сравнивается содержимое R1 с числом 208. Коды условий устанавливаются в зависимости от содержимого R1 следующим образом:

если содержимое Rl=20, то 7 = 1;

если содержимое Rl<>20, то Z=0;

если содержимое Rl<20, то N=1; если содержимое R1>=20, то N=0.

Команда TST(B) (test — проверка) анализирует операнд-приёмник и устанавливает коды условий Z и N, позволяя тем самым определить знак операнда или выяснить, не равен ли операнд нулю. Сам операнд не изменяется.

Команды безусловных переходов. Команда BR (branch — бе­зусловный переход) осуществляет безусловный переход на указан­ную в поле операнда метку. С помощью этой команды можно организовать бесконечный цикл, если переход осуществляется назад, либо обход некоторого фрагмента программы, если переход осуществляется вперед.

Команда JMP (jump — переход) выполняет ту же функцию, что и команда BR, но имеет большие возможности. По своему формату это обычная одноадресная команда, в которой можно использовать любые виды адресации. Например команда

JMP(R2)

передает управление по адресу, находящемуся в R2, а команда

JMP LABEL

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

Команда простых переходов. Каждая из команд простых пере­ходов анализирует какой-либо разряд кодов условий из ССП и реализует переход по адресу, указанному в поле операнда коман­ды, при выполнении соответствующего простого условия.

Команда BNE (branch if not equal — переход по неравенству 0) организует переход, если результат выполнения предыдущей опе­рации не равен 0 (соответственно Z=0).

Команда BEQ (branch if equal — переход по равенству 0) организует переход, если результат выполнения предыдущей опе­рации равен О (Z=l).

Команда BPL (branch if plus — переход по плюсу) организует переход, если результат выполнения предыдущей операции больше или равен О (N=0).

Команда BMI (branch if minus — переход по минусу) органи­зует переход, если результат выполнения предыдущей операции меньше О (N=1).

Команды BVC и BVS (branch if V is clear — переход, если V=0, и branch if V is set — переход, если V=l) организует пере­ходы по состоянию разряда V ССП.

Команда ВСС и BCS (branch if С is clear — переход, если С=0 и branch if С is set — переход, если C=.l) организуют пере­ходы по состоянию разряда С ССП. Установка разряда С ССП может сигнализировать о переносе из старшего разряда при вы­полнении какой-либо арифметической операции, однако гораздо чаще эти команды исползуются при обращении к программам операционной системы.

Команды простых переходов, особенно BNE, BEQ, BPL и BMI, часто используют при организации циклов. В приводимом ниже примере показана организация циклов в программах на АССЕМБЛЕРе.

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

Во втором случае в используемом регистре хранится и нара­щивается адрес нужного элемента. Анализ на выход из цикла выполняется путем сравнения содержимого регистра с адресом последнего слова массива.

Первый вариант решения:

MASSIV: .BLKW 100

CLR R0

GO: CLR MASSIV (RO)

INC RO

INC RO

CMP R0,#200

BNE GO

Второй вариант решения:


MASSIV: .BLKW 100

MOV #MASSIV, RO

GO: CLR (R0) +

CMP RO, #MASSIV+200

BNE GO


Специально для организации циклов в составе команд АССЕМБЛЕРа предусмотрена команда SOB (subtract one and branch, вычитание 1 и переход). Формат этой команды: SOB Rn, LABEL. В регистр Rn заносят требуемое число шагов, а меткой LABEL метят первую строку цикла. Саму команду SOB становят в конце тела цикла. Каждый раз при выполнении команды SOB содержимое Rn уменьшается на 1, и если оно еще не стало равным О осуществляется переход на метку LABEL (обязательно назад по ходу программы). Если содержимое Rn стало равным 0, что говорит о выполнении заданного числа шагов, команда SOB как бы не срабатывает, переход на начало цикла не выполняется и цикл завершается.

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

Последний пример при использовании команды SOB будет выглядеть следующим образом:


MASSIV: .BLKW 100

MOV #MASSIV, RO

MOV #100, Rl

GO: CLR (R0) +

SOB GO


Задача 5.10 Сцелью создания текстового массива заполнить область памяти кодами ASCII от 40 (пробел) до 137 (знак —), всего 64 символа


ASCII: .BLKB 64

MOV #63. , RO

MOV #137, Rl

ON: MOVB Rl, ASCII (RO)

DEC Rl

SOB RO, ON

MOVB Rl, ASCII

Задача 5.11 Вычесть из спектра (256 каналов) поканально. Результат записать на место спектра:

SPECTR: .BLKW 256. ; спектр

BACKGR: .BLKW 256. ; фон

CLR R4

BEGIN SUB BACKGR (R4), SPECTR (R4)

INC R4

INC R4

CMP R4, #512.

BNE BEGIN


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

Задача 5.12 Проверить содержимое регистра R3. Если оно равно 0, перейти

на метку P1:

TST R3

BEQ P1


Задача 5.13 Проверить содержимое ячейки STATUS. Если в ней установлен старший разряд, перейти на метку ERROR:


TST STATUS

BMI ERROR


Логические команды. Эти команды работают с отдельными разрядами операнда-приемника. В операнде-источнике указывается, с какими именно разрядами следует выполнить указанную операцию. Если, например, требуется выборочно, т. е. не затраги­вая остальные разряды приемника, установить или сбросить раз­ряды О, 1 и 2, то операнд-источник будет равен 7, так как число 7, записанное в двоичной форме, содержит 1 в разрядах 0, 1 и 2. Если надо установить или сбросить разряды 1-4 и 15, то операнд-источник будет равен 140000, так как это число образуется едини­цами в двоичных разрядах 14 и 15.

Команда BIS (В) (bit set, установка разрядов) устанавливает указанные разряды.

Команда BIC(B) (bit clear, сброс разрядов) очищает (сбрасы­вает) указанные разряды.

Приведем несколько примеров:

BIS # 100,@# 177550 ; установить разряд 6 по абсолют -

; ному адресу 177550

BIC #100,@#164000 ; сбросить разряд 6 по абсолютному

; адресу 164000

BIC #125252,V ; сбросить все нечетные разряды

; ячейки V

BIS #340,R2 ; установить разряды 5, 6 и 7 в R2


BIS RO, Rl ; установить в Rl те разряды, кото-

; рые установлены в RO (остальные

; разряды в R1 остаются без изме-

; нения)

BIC RO, R1 ; сбросить в R1 те разряды, которые

; установлены в RO