Программа на языке ассемблера, соответствующая
программе табл. 5.3
Итак, метка — это символический адрес, который можно выбрать таким образом, чтобы программа легче читалась и чтобы можно было при необходимости сослаться на команду. Поскольку в программе приходится ссылаться далеко не на каждую команду, поле метки может оставаться пустым. В программе в табл. 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 - 2025 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...
|