Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Metodicheskie_ukazania_k_kursovomu_proektu_VMSi....doc
Скачиваний:
5
Добавлен:
20.04.2019
Размер:
4.98 Mб
Скачать

Язык ассемблера

Чтобы проиллюстрировать тесную взаимосвязь между языком ас­семблера и языком машинных команд, обратимся снова к программе вычисления суммы 10 чисел из разд. 3. Программа была приведена в табл. 5.3, причем именно загружаемая в микрокомпьютер программа приведена в графе «команды на машинном языке».

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

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

Таблица 5.9

Программа на языке ассемблера, соответствующая программе табл. 5.3

Метка

Операция

Операнды

Комментарий

LRI

1, H(NUM) ;

УСТ. НА Н, L АДРЕС ПЕРВОГО

LRI

2, L(NUM) ;

ЧИСЛА

LRI

3, 10D ;

НАЧАЛЬН. ЗНАЧ. СЧЕТЧИКА

LRI

4, 0D ;

УСТ. В 0 ЧАСТИ. СУММУ

LR1

5, 1D ;

КОНСТ 1 ДЛЯ УМЕНЬШ. СЧЕТЧИКА

LOOP:

MOV

0, 4 ;

СЛОЖЕНИЕ ОЧЕРЕДИ. ЧИСЛА

ADD

F

MOV

4, 0

IHL

;

УВЕЛИЧЕНИЕ Н И L

MOV

0, 3 ;

УМЕНЬШЕНИЕ СЧЕТЧИКА

SUB

5

MOV

3, 0

JAN

LOOP ;

ТЕСТИРОВАНИЕ СЧЕТЧИКА

HLT

NUM:

RES

10D ;

РЕЗЕРВИР. МЕСТА ДЛЯ ЧИСЕЛ

END

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

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

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

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

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

В нашей программе NUM представляет собой символический ад­рес первого элемента суммируемых данных. В сочетании с кодом операции LRI эти 8 разрядов образуют непосредственные данные в команде. Таким образом, предложение на языке ассемблера LRI 1, H(NUM) вызывает загрузку в общий регистр 1 старших 8 битов ад­реса первого элемента данных. Аналогично L ( ) задает операцию вы­деления младших 8 битов, и, следовательно, L (NUM) означает млад­шие 8 битов адреса NUM. Эти 8 битов будут интерпретированы ассем­блером в качестве второго байта машинной команды, соответствующей предложению LRI 2, L(NUM).

В связи с табл. 5.9 отметим еще три момента. Во-первых, число­вые значения задаются в поле операндов вместе с указателем системы счисления. Например, в третьем предложении конструкция 10D означает, что константу 10 нужно считать десятичным числом. Ас­семблер при трансляции переведет эту константу в двоичную систему. Во-вторых, все общие регистры задаются своими шестнадцатеричными номерами. И наконец, в-третьих, запятая между операндами в предло­жении MOV всегда интерпретируется как слово «from», т. е. «из». Та­ким образом, предложение MOV 0, 4 означает загрузку в общий ре­гистр 0 (аккумулятор) содержимого из (from) общего регистра 4. Напомним, что в предложении MOV по крайней мере один из регистров должен иметь номер О, 1 или 2. Если программист нарушит это огра­ничение, ассемблер обнаружит ошибку и выдаст соответствующее сообщение. Это одна из типичных обнаруживаемых ассемблером оши­бок.

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