Главная -> Книги

(0) (1) (2) (3) (4) (5) (6) (7) (8) (9) (10) (11) (12) (13) (14) (15) (16) (17) (18) (19) (20) (21) (22) (23) (24) (25) (26) (27) (28) (29) (30) (31) (32) (33) (34) (35) (36) (37) (38) (39) (40) (41) (42) (43) (44) (45) (46) (47) (48) (49) (50) (51) (52) (53) (54) (55) (56) (57) (58) (59) (60) (61) (62) (63) (64) (65) (66) (67) (68) (69) (70) (71) (72) (73) (74) (75) (76) (77) (78) (79) (80) (81) (82) (83) (84) (85) (86) (87) ( 88 ) (89) (90) (91) (92) (93) (94) (95) (96) (97) (98) (99) (100) (101) (102) (103) (104) (105) (106) (107) (108) (109) (110) (111) (112) (113) (114) (115) (116) (117) (118) (119) (120) (121) (122) (123) (124) (88)

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

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

Комментарий

ARRAY: .WORD 127., 63., 31., 15., 7., 3. 2., I.

MOV AR Y Rl ***

MOV ARRAY+3, Rl

5 Загрузка в RI чис \ ла 127

• Загрузка в Rl чис : ла 15

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

Значения, формируемые директивами DB и DW, загружаются в память только один раз, поэтому эти директивы используются для инициализации констант, которые программа не должна изменять. Инициализировать переменные с помощью директив DB и DW не следует, так как, если программа выполняется повторно без загрузки, значения переменных будут модифицированы. Для инициализации переменных в программе необходимы специальные команды.

В директиве DC определения символов (другое обозначение .АЗСП) поле операнда содержит цепочку символов, заключенную в апострофы. При ассемблировании коды символов помещаются в,смежные байты программы.

Директива DS (другое обозначение RMB) резервирования памяти с выражением в поле операнда распределяет память для хранения переменных. Ассемблер вычисляет значение выражения и прибавляет его к счетчику адреса. При загрузке программы эти байты не инициализируются, в частности, не следует полагать, что они содержат нули. Директива .BLKW выполняет аналогичную функцию, но



резервирует слова. Отметим, что зарезервировать память можно с помощью счетчика адреса, например оператор.= = . + 32. обеспечивает резервирование 32 байтов памяти.

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

" Метка Код Операнд

[метка:] IF <выражение>

Фрагмент исходной программы [метка:] ENDIF

Ассемблер вычисляет значение выражения из поля операнда. Если оно равно нулю, операторы между директивами IF и ENDIF пропускаются, а когда значение выражения отлично от нуля, фрагмент ассемблируется обычным образом. Ассемблер может иметь целый набор директив условного ассемблирования (разумеется, с различными мнемониками), которые позволяют проверить значение выражения «на нуль», «не нуль», «меньше нуля», «не больше нуля», «больше нуля», «не меньше нуля».

В ассемблерах процессоров, адресующих слова памяти, голгзной является директива .EVEN, которая устанавливает счетчик адреса на четное значение, т. е. производит его инкремент в случае нечетного текущего значения. Ее рекомендуется использовать после директив .BYTE и .ASCII.

Макрокоманды. В языке ассемблера многих ЭВМ имеется удобное средство, позволяющее уменьшить длину исходной программы, улучшить ее структуру и сократить время разработки. Этим средством являются макрокоманды. Макрокоманды дают возможность пользователю один раз в начале программы определить (наименовать) последовательность ассемблерных операторов, а затем использовать введенное имя как замену определенной последовательности. Таким образом, макрокоманды как бы расширяют систему команд ЭВМ, добавляя в нее «большие» команды, наиболее удобные для конкретной прикладной программы. С их помощью можно имитировать мнемоники команд других ЭВМ и генерировать для них объектные программы.



Принцип использования макрокоманд ясен из следующего простого примера. Для увеличения содержимого регистра REG на 4 команду INC инкремента на единицу придется повторить четыре раза:

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

INC REG

INC REG

INC REG

INC REG

Эти команды увеличивают содержимое регистра REG на 4

Когда необходимость увеличения содержимого REG на 4 встречается еще несколько раз, пользователь должен всякий раз копировать приведенные команды. (Конечно, эту же функцию выполняет команда сложения с непосредственным операндом 4, поэтому данные команды следует рассматривать только как пример). Если же один раз наименовать эту последовательность, например INC4, то затем имя INC4 можно использовать в поле кода, а простую за-. дачу замены имени INC4 четырьмя командами INC REG может выполнить программа-ассемблер. Ассемблер, в котором допускается использовать макрокоманды, называется макроассемблером.

Определение и вызов макрокоманд подчеркивают кх отличие от подпрограмм (см. § 7-5), которые иллюстрирует рис. 7-1. Тело подпрограммы включается в объектную программу один раз, а выполнение ее инициируется специальной командой вызова CALL или JSR. После выполнения подпрограммы другая специальная команда RET или RTS осуществляет возврат из подпрограммы в точку вызова. Подпрограммы со стандартным механизмом вызова и возврата называются замкнутыми подпрограммами. Недостаток их заключается в непроизводительных потерях времени на передачу параметров, вызов и возврат, а достоинство - в экономии программной памяти. Тело макрокоманды при каждом употреблении ее имени в поле кода целиком включается в объектную программу, что объясняет другое название макрокоманд - открытые подпрограммы. Макрокоманды не экономят программную память, но устраняют потери времени процессора на вызов и возврат.

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



(0) (1) (2) (3) (4) (5) (6) (7) (8) (9) (10) (11) (12) (13) (14) (15) (16) (17) (18) (19) (20) (21) (22) (23) (24) (25) (26) (27) (28) (29) (30) (31) (32) (33) (34) (35) (36) (37) (38) (39) (40) (41) (42) (43) (44) (45) (46) (47) (48) (49) (50) (51) (52) (53) (54) (55) (56) (57) (58) (59) (60) (61) (62) (63) (64) (65) (66) (67) (68) (69) (70) (71) (72) (73) (74) (75) (76) (77) (78) (79) (80) (81) (82) (83) (84) (85) (86) (87) ( 88 ) (89) (90) (91) (92) (93) (94) (95) (96) (97) (98) (99) (100) (101) (102) (103) (104) (105) (106) (107) (108) (109) (110) (111) (112) (113) (114) (115) (116) (117) (118) (119) (120) (121) (122) (123) (124)