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

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

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

Последнюю группу образуют приказы ввода и вывода текста. Приказ ввода А (append) используется для ввода текстового файла, например с перфоленты или гибкого диска, в буфер текста. При его выполнении вводимый текст добавляется к тексту, уже находящемуся в буфере. После инициирования этого приказа текст вводится до удовлетворения одного из следующих условий: воспринимается символ конца файла EOF (этот символ не записываете в буфер текста); буфер текста заполнен; в буфер текста введено очередное число строк текста, зависящее от конкретной реализации редактора; воспринимается символ перевода формата FF (он записывается в буфер текста); достигнуто физическое окончание файла.

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

С помощью приказа E(exit) окончания редактирования и перехода к монитору осуществляется вывод всего содержимого буфера текста и управление передается монитору операционной системы. После выполнения приказа Е содержимое буфера текста сбрасывается в нуль.

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



Таблица 7-2

Имена, обрабатываемые ассемблером

Тип имени

Значение (состав) имени

Мнемоника команды

Код операции, формат и длина

команды

Директива

Адрес продпрограммы, осуществляю-

щей ее обработку

Имя регистра

Целое без знака

Метка

Относительный адрес в программе,

целое без знака

Имя, определенное пользова-

Целое без знака

телем

Внешнее обращение

Список появлений в программе

Основная функция программы-ассемблера заключается в последовательном просмотре (сканировании) строк исходной программы и преобразовании каждой из них в один оператор объектной программы. Естественное исключение составляют макровызовы и некоторые директивы ассемблера. Необходимо учитывать также, что во всех современных ЭВМ машинные команды имеют различную длину. Полный просмотр исходной программы называется проходом.

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

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

Формированию объектной программы за один проход препятствуют обращения (ссылки) вперед, соответствую-



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

NEXT: RAL

NEXT

В этих ситуациях ассемблер не может сразу определить адрес перехода. Тем не менее, при желании можно реализовать однопроходовый ассемблер.

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

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

Самое простое решение проблемы обращений вперед заключается в сканировании исходной программы два раза:

NEXT:

Таблица имен

NEXT

Неопределенная метка

Указатель

Рис. 7-3. Обработка обращения вперед



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