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

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

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

Программа - транслятор с языка ассемблера называется ассемблирующей программой или, короче, ассемблером. Если ассемблер реализован на ЭВМ, которая может выполнять полученную объектную программу, его называют естественным ассемблером. Ассемблер, который постоянно находится в памяти ЭВМ, называется резидентным. Для хранения резидентного ассемблера, рассчитанного на минимальную конфигурацию мащины, достаточно ПЗУ емкостью 4К-8К байт. Нерезидентный ассемблер хранится во внешней памяти, например в накопителе на гибком диске или даже на перфоленте, а при необходимости загружается в оперативную память.

Ассемблер, реализованный на ЭВМ, которая не может выполнять объектную программу, называется кросс-ассемблером. Кросс-ассемблеры для микро-ЭВМ обычно реализуются на мини-ЭВМ и в сетях ЭВМ с разделением времени. Сформированные кросс-ассемблерами объектные программы выводятся на некоторый носитель и загружаются с него в память ЭВМ, для которой они предназначены tцeлeвoй ЭВМ). Такую загрузку можно осуществить также по линии связи.

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

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

В большинстве ассемблеров современных ЭВМ строки имеют четыре поля: метку, операцию (код операции, код),



операнд (аргумент) и комментарий. Из всех полей в каждой строке только поле кода должно быть непустым, остальные поля могут быть пустыми.

Чтобы показать характерные особенности языка ассемблера, приведем простой фрагмент программы для процессоров СМ. Программа инициализирует массив ARRAY йз 10 слов, причем в i-e слово (1110) загружается значение i-1:

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

.= 1000. ; Начало программы с

; ячейки 1000

START: MOV #20., Rl ; Длина массива 20 байт

NEXT: SUB #2, Rl ; Декремент индекса

MOV Rl, RO ; Вычисление значения

ASR RO ; элемента массива

MOV RO, ARRAV(Rl) ; Инициализация элемен-

! та

BNE NEXT ; Зацикливание

HALT ; Останов процессора

ARRA .WORD О, О, О, О, 0. О, 0.0, О, О ; Память для массива

.END START ; Пусковой адрес про-

граммы

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

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

Наиболее важное поле кода содержит мнемонику машинной команды или директивы ассемблера. Мнемоника выражает основные функции команды или директивы и со-



стоит из 1-10 символов, например А, ADD (add)-сложить; S, SUB (subtract) -вычесть; ROTL (rotate left) - циклически сдвинуть влево; В, BR (branch) - перейти.

Часто мнемоника специфицирует размер операнда, например MOV или MOVE.W - переслать слово; MOVB или MOVE.В - переслать байт; MOVE.L - переслать длинное слово (32 бита).

По мере расширения системы команд мнемоники становятся более громоздкими, например MOVSB (move string of byte) - переслать байтную цепочку; LOOPNZ (loop if поп zero)- повторить цикл, ебли не нуль.

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

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

Поле операнда идентифицирует один или два операнда команды, поэтому оно интерпретируется в соответствии с функцией команды. Операнды определяются именами, численными и символьными константами, а также выражениями. В командах с неявной адресацией поле операнда пустое, например в командах СМА - инвертировать аккумулятор, STC - установить флажок переноса и др.

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

Символьные константы в большинстве ассемблеров вводятся с помощью заключения их в апострофы или кавычки, причем иногда достаточно только начального апострофа. Численные константы представляются в различных системах счисления, что указывается специальными дескрипторами. Например, в ассемблере микропроцессора КР580 система счисления определяется буквой, завершающей число: Н - 16-ричная, О (или Q)-8-ричная, D - десятичная, В - двоичная. Отсутствие дескриптора означает десятич-



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