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

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

ное число. 16-ричные числа должны начинаться с цифр О-9. В ассемблере процессоров СМ десятичное число идентифицируется завершающей точкой, а остальные числа считаются 8-ричными.

-Чтобы прослеживать размещение ассемблируемой про граммы в памяти, во всех ассемблерах используется внут ренняя переменная, называемая счетчиком адресов (ячеек) Она обозначается специальным символом, например звез дочкой (•) или точкой (.). Счетчик адресов инициализиру ется специальной директивой а модифицируется после об работки каждой строки путем прибавления длины команды или данных. При ассемблировании счетчик адресов ведет себя как аппаратный программный счетчик РС. Однако при обработке констант счетчик адресов принимает такие значения, которые РС никогда не примет.

Допустимые выражения в поле операнда зависят от конкретного ассемблера, но, как минимум, в них могут фигурировать константы, текущее значение счетчика адресов, имена и указанные выше термы, соединяемые знаками арифметических и логических операций. Обычно допускаются операции сложения, вычитания, дизъюнкции и конъюнкции. В более совершенных ассемблерах можно использовать операции умножения, деления, сдвига, вычисления остатка от деления, а также применять скобки. Вычисление выражения производится строго слева направо, а старшинство операций, обычное для языков высокого уровня, может не соблюдаться. Например, выражение А+В • С вычисляется как (A-I-B) «С, а не как обычно A-t-(В . С). Значение выражения из поля операнда вычисляется один раз во время ассемблирования.

В поле комментария содержится краткое пояснение действий команды в контексте конкретной программы. Начало комментария идентифицируется разделителем (чаще всего точка с запятой или наклонная черта), а текст его, содержащий любые печатные символы (включая пробел), полностью игнорируется при ассемблировании, но печатается в листинге программы. Комментарием может быть целая строка, начинающаяся с соответствующего разделителя. Интуитивное желание пользователя экономить память (каждый символ - байт!) не должно приводить к сокращению комментариев в ущерб пониманию программы другими людьми. Комментарии ради удобства даются малыми русскими буквами.

Имеются две разновидности размещения полей в позициях строки. Фиксированный формат рассчитан на то, что



каждое поле занимает определенные позиции строки. Например, при подготовке программ для кросс-ассемблера на перфокартах каждому полю отводятся конкретные колонки. Здесь не требуются специальные разделители полей, но несколько усложняется подготовка программ. В более удобном свободном формате границы полей не фиксируются, но необходимы разделители полей, в качестве которых используются пробел, двоеточие, точка с запятой, запятая и др. Для правильной идентификации полей устанавливается набор правил следующего вида: 1) любое число пробелов эквивалентно одному пробелу; 2) имя, заканчивающееся двоеточием, считается меткой; 3) в первой позиции строки, которая не содержит метки, должен быть пробел; 4) символы между первым и вторым разделителями интерпретируются как мнемоника; 5) если команда не требует операнда, остальная часть строки считается комментарием; 6) когда операнд необходим, символы между вторым и третьим разделителями считаются операндом; аналогично интерпретируются операторы с несколькими операндами, и разделителем операндов обычно служит запятая; 7) комментарий начинается со специального разделителя, йапри-мер с точки с запятой.

Режимы адресации. Необходимы специальные соглашения об идентификации в поле операнда многочисленных режимов адресации, которые имеются в современных ЭВМ. Например, такие соглашения для процессоров СМ используют условные обозначения: R - регистр, Ехрг - выражение. Чтобы отличить регистры от ячеек памяти с одинаковыми адресами, используется символ %, например %0 обозначает регистр R0, %1 - регистр RI и т. д. Более удобные содержательные обозначения R0-R5, SP, PC вводятся в начале программы с помощью операторов прямого присваивания: R0=% О, RI = % 1,..., R5=% 5, SP = = %6, РС=%7.

Директивы ассемблера. Директивы сообщают программе-ассемблеру ииформацивд, необходимую для формирования фиксированных таблиц, определения имен, резервирования памяти для переменных, размещения в памяти программ и подпрограмм и задания формата листинга. Хотя их мнемоники директив появляются в поле кода, директи-вь1 не соответствуют машинным командам, что объясняет их другое название «псевдокоманды». Метки и комментарии в директивах необязательны, а содержимое поля операнда зависит от их функций. В языке ассемблера процессоров СМ первым символом директивы должна быть точка,



но это не является обязательным условием для ассемблеров других ЭВМ. Ниже рассматриваются наиболее распространенные директивы.

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

Директива окончания END свидетельствует о достижении физического конца исходной программы. Следовательно, эта директива должна быть в последней строке любой программы. Операнд директивы END определяет начальную точку выполнения программы (пусковой адрес) после ее ассемблирования без ошибок.

С помощью директивы EQU прямого присваивания имени, находящемуся в поле метки (чтобы отличить имя от обычной метки, после него обычно не ставят двоеточия), присваивается вычисленное значение выражения из поля операнда. Эту же функцию в ассемблере процессоров СМ выполняет оператор прямого присваивания со следующим форматом: <;имя> = <выражение>. Когда слева от знака равенства находится точка, обозначающая счетчик адресов, получается эквивалент директивы ORG.

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

Директивы DB (другие названия .BYTE и FCB) и DW (другие названия .WORD и FCW) предназначены для задания констант длиной в байт и слово соответственно.



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