Реклама:

Ассемблер as88 построен по модели стандартного ассемблера UNIX, в связи с чем он в некоторых отношениях довольно существенно отличается от макроассемблера Microsoft MASM и ассемблера Borland 8088 TASM. И MASM, и TASM были разработаны для операционной системы MS-DOS, и связь операционной системы и ассемблера в определенных аспектах прослеживается весьма отчетливо. MASM и TASM поддерживают все модели памяти 8088, поддерживаемые MS-DOS. К примеру, в них предусмотрены миниатюрная модель памяти, в которой весь код и все данные, вместе взятые, должны умещаться в 64 Кбайт, малая модель, где по 64 Кбайт отводится под каждый из этих сегментов, и большая модель, допускающая наличие множества кодовых сегментов и сегментов данных. Различия между этими моделями зависят от способа применения сегментных регистров. В большой модели можно выполнять дальние вызовы и изменять регистр DS. Процессор сам по себе налагает некоторые ограничения на сегментные регистры (например, регистр CS не может быть целевым адресом в команде M0V). Для упрощения трассировки в as88 применяется модель памяти, сходная с малой, хотя ассемблер и без помощи трассера может обрабатывать сегментные регистры без каких-либо дополнительных ограничений.

В двух вышеупомянутых ассемблерах нет секции BSS, а инициализируют память они только в секциях данных. Обычно код на языке ассемблера начинается с заголовка в том или ином виде; затем следует секция данных, обозначаемая ключевым словом .data, после чего пишется текст программы с ключевым словом .code. В заголовке используются ключевые слова title (название программы), .model (модель памяти) и .stack (резервирование памяти для стекового сегмента). Если целевой двоичный файл должен быть записан с расширением .com, применяется миниатюрная модель памяти; при этом все сегментные регистры уравниваются, а в начале объединенного сегмента 256 байт резервируются для "префикса сегмента программы".

Вместо директив .WORD .BYTE и ASCIZ в ассемблерах TASM и MASM применяются ключевые слова DW (определение слова) и DB (определение байта). После директивы DB может быть помещено определение строки в двойных кавычках. После меток в определениях данных двоеточия не ставятся. Крупные блоки памяти инициализируются ключевым словом DUP; перед ним указывается число байтов, а после него определяется инициализация. Например:

LABEL DB 1000 DUP (0)

Этот оператор инициализирует 1000 байт памяти байтами ASCII-нулей по адресу метки LABEL.

После меток подпрограмм устанавливается не двоеточие, а ключевое слово PR0C. В конце подпрограммы эта метка дублируется, а после нее ставится ключевое слово ENDP, которое позволяет ассемблеру определить точную область действия подпрограммы. Локальные метки не поддерживаются.

Ключевые слова, применяемые с командами, идентичны в MASM, TASM и as88. Кроме того, в командах с двумя операндами исходный операнд ставится после целевого. С другой стороны, чаще всего для передачи аргументов функциям используется не стек, а регистры. Если же программы на языке ассемблера вставляются в программы на С или С++, стек предпочтительнее, поскольку он согласуется с механизмом вызова подпрограмм С. Это не очень принципиально, поскольку в as88 стек можно заменить регистрами.

Самое существенное различие между MASM, TASM и as88 сводится к механизму выполнения системных вызовов. В MASM и TASM они совершаются с помощью системного прерывания INT. Самый распространенный его вариант - INT 21Н; он применяется для выполнения системных вызовов MS-DOS. Номер вызова при этом помещается в регистр АХ (вновь аргументы передаются регистрам). Различным устройствам соответствуют разные векторы и номера прерываний, например, INT 16Н для клавиатурных функций BIOS и INT ЮН для дисплея. Чтобы программировать эти функции, программист должен знать огромное количество данных о тех или иных устройствах. Системные вызовы UNIX, реализованные в as88, значительно проще.

Ассемблер as88 из набора АСК || Оглавление || Трассер