Главная | Обратная связь | Поможем написать вашу работу!
МегаЛекции

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




программе табл. 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    
  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. Если программист нарушит это огра­ничение, ассемблер обнаружит ошибку и выдаст соответствующее сообщение. Это одна из типичных обнаруживаемых ассемблером оши­бок.

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

Директивы ассемблера

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

С помощью директив одного типа определяются слова данных. Они позволяют ассемблеру сформировать константу и поместить ее в ячейку памяти. Значение константы задается в поле операндов, а ее символический адрес — в поле метки. Аналогичным образом можно задать символ в коде ASCII. Предположим, например, что мнемони­ческий код операции DB (Define a Byte — определить байт) соответ­ствует директиве определения байта. Тогда при трансляции предло­жения

CONST: DB 53H

ассемблер поместит шестнадцатеричное число 53 в ячейку с символи­ческим адресом CONST.

С помощью директив другого типа можно зарезервировать группу ячеек памяти и дать этой группе символическое имя. Это оказывается полезным, когда нужно отвести место для входных, выходных или промежуточных данных. Число резервируемых ячеек указывается в поле операндов, а символический адрес первой ячейки группы - в поле метки. Директива такого типа встречается в программе в табл.5.9 и имеет мнемонический код операции RES (от REServe - резервировать). Встретив предложение

NUM: RES 10D

ассемблер зарезервирует десять ячеек памяти (поскольку D - это код десятичной системы), причем первой из них будет присвоен сим­волический адрес NUM.

Помимо уже упомянутых директив, существуют директива для задания абсолютного адреса в объектной программе и директива для указания конца программы. Вторая из них присутствует в программе в табл. 5.9 и имеет обозначение END (конец). Она просто указывает ассемблеру, где заканчивается исходная программа. Чтобы пояснить директиву, задающую абсолютный адрес, предположим, что ее мне­моническое обозначение ORG (от ORiGin — начало). Тогда предло­жение

ORG 1000H

информирует ассемблер о том, что следующая команда должна иметь шестнадцатеричный адрес 1000. Поэтому, если бы такое предложение предшествовало программе в табл. 5.9, адрес команды LRI 1, Н (NUM) оказался бы равным 1000; в то же время, если бы это предло­жение оказалось между предложениями HLT и RES, группа ячеек NUM расположилась бы в памяти, начиная с адреса 1000.

Макрокоманда

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

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

 

 

Приложение П1

Поделиться:





Воспользуйтесь поиском по сайту:



©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...