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

(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) (89)

.MACRO <имя> ,<спйСок формальных параметров > Операторы ассемблера, образующие тело макрокоманды .ENDM

Подпрограмм»


Входная программа

Объектная, программа

Вызов

макрокоманд

Вызов макрокоманды

Тело макрокоманды

Тело Чакрокрманды

Тепо макрокоманды

f / / / /

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

Рис. 7-1. Обращение к подпрограмме (а) и вызов макрокоманды (6)



Приведенная выше макрокоманда INC4 определяется таким образом:

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

.MACRO

INC4, REG

.ENDM

Несколько отличающийся формат макроопределений принят в ассемблере микропроцессора КР580:

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

<имя> MACRO <список формальных параметров>

Операторы ассемблера, образующие тело макрокоманды

ENDM

Отметим появление специальных директив MACRO я ENDM, а также список формальных (фиктивных) параметров (аргументов). Список представляет собой последовательность имен с разделителями между ними. В качестве разделителя обычно используется запятая, но иногда допускаются также пробел и точка с запятой. Макроопределения не генерируют команд объектной программы, они предназначены для «внутреннего использования» макроассемблером. Для проверки парности директив MACRO и ENDM в поле операнда директивы ENDM рекомендуется указывать имя макрокоманды.

Вызов макрокоманды (макровызов) имеет следующий формат:

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

<имя> < список фактаческнх параметров >

Таким образом, макровызов заключается в том, что имя ранее определенной макрокоманды появляется в поле кода и сопровождается списком фактических (действительных) параметров. Каждый макровызов заставляет ассемблер производить расширение макрокоманды (макрорасшире-



ние), т.е. включать в программу тело макрокоманды, в котором формальные параметры заменяются на фактические. Замена производится текстуально в соответствии с положением параметров в списках макроопределения и макровызова. Например, вызов INC R0 приведет к следующему расщирению:

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

INC R0

INC R0

INC R0

INC R0

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

Применение вложенных макровызовов часто помогает улучшить структуру программы и всегда сокращает длину исходной программы.

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

Оптимизация ассемблерных программ. При программировании на ассемблере используются несколько приемов, направленных на сокращение длины и времени выполнения програмы. Ниже приведены некоторые приемы для микропроцессора КР580.

1. Если сразу после команды вызова следует команда возврата, их можно заменить одной командой перехода к подпрограмме. Например, исходный фрагмент из двух команд CALL SUBR; RET заменяется одной командой JMP SUBR. Предполагается, конечно, что сама подпрограмма SUBR заканчивается командой возврата.

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



(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)