assembler. Учебник для вузов_Юров В.И_2003 -637с (862834), страница 24
Текст из файла (страница 24)
Для того чтобыиспользовать их как сегменты кода, данных или стека, необходимо предварительно сообщить транслятору об этом с помощью специальной директивы ASSUME, формат которой показан на рис. 5.15. Эта директива сообщает транслятору, какой сег-106Глава 5. Синтаксис ассемблерамент к какому сегментному регистру привязан. В свою очередь, это позволяет транслятору корректно связывать символические имена, определенные в сегментах.Привязка сегментов к сегментным регистрам осуществляется с помощью операндов этой директивы, в которых имя_сегмента должно быть именем сегмента, определенным в исходном тексте программы директивой SEGMENT или ключевым словом NOTHING. Если в качестве операнда используется только ключевое словоNOTHING, то предшествующие назначения сегментных регистров аннулируются,причем сразу для всех шести-сегментных регистров.
Ключевое слово NOTHING можнотакже использовать вместо аргумента имя сегмента; в этом случае будет выборочноразрываться связь между сегментом с именем имя сегмента и соответствующим сегментным регистром.Рис. 5.15. Директива ASSUMEРассмотренные ранее директивы сегментации используются для оформленияпрограммы в трансляторах MASM и TASM. Поэтому их называют стандартнымидирективами сегментации.Для простых программ, содержащих по одному сегменту для кода, данных и стека, хотелось бы упростить их описание. Для этого в трансляторы MASM и TASMбыла введена возможность использования упрощенных директив сегментации.
Приэтом возникла проблема, связанная с тем, что необходимо было как-то компенсировать невозможность напрямую управлять размещением и комбинированием сегментов. Для этого совместно с упрощенными директивами сегментации стали использовать директиву указания модели памяти MODEL, которая частично сталауправлять размещением сегментов и выполнять функции директивы ASSUME (поэтому при введении в программу упрощенных директив сегментации директивуДирективы сегментации107ASSUME можно не указывать). Директива MODEL связывает сегменты, которые приналичии упрощенных директив сегментации имеют предопределенные имена,с сегментными регистрами (хотя все равно придется явно инициализироватьрегистр DS).Для сравнения приведем два листинга с программами на ассемблере. Функционально они одинаковы и выводят на консоль сообщение: «Hello World! No war andbomb! Let's live friendly and learn assembler language.».
Листинг 5.1 содержит программу со стандартными директивами сегментации, а листинг 5.2, соответственно, — с упрощенными.Листинг 5.1. Использование стандартных директив сегментацииdatasegment para public 'data'message db 'Hello World! No war and bomb! Let us live friendly and learnassembler language. $'dataendsstk segment stackdb 256 dup ('?')сегмент стекаstk endscodesegment para public 'code'начало сегмента кодаmainprocначало процедуры mainassume cs:code,ds:data,ss:stkmov ax,dataадрес сегмента данных в регистр ахmov ds.axах в dsmov ah,9mov dx,offset messageвывод сообщения на экранint 21hmov ax,4cOQhпересылка 4c00h в регистр ахвызов прерывания с номером 21hint 21hконец процедуры mainmainendpконец сегмента кодаcodeendsконец программы с точкой входа mainend mainЛистинг 5.2.
Использование упрощенных директив сегментациирежим работы для TASM - masm, для MASM - не нужноmasmmodelsmallмодель памятисегмент данных.datamessage db 'Hello World! No war and bomb! Let us live friendly and learnassembler language.stack 256hсегмент стекасегмент кода.codeначало процедуры mainmainprocзаносим адрес сегмента данных в регистр ахmov ax,@datamov ds,axах в dsmov ah,9movintmovintdx,offset messageвывод сообщения на экран21hax.4c00hпересылка 4с00п в регистр ахвызов прерывания с номером 21h21hконец процедуры mainmainendpконец программы с точкой входа mainend mainСинтаксис директивы MODEL показан на рис. 5.16.Обязательным параметром директивы MODEL является модель_памяти.
Этот параметр определяет модель сегментации памяти для программного модуля. Предполагается, что программный модуль может иметь только определенные типысегментов, которые определяются так называемыми упрощенными директивамиописания сегментов (табл. 5.3).108Глава 5. Синтаксис ассемблера\ MODELРис. 5.16. Синтаксис директивы MODELТаблица 5.3. Упрощенные директивы определения сегментаФормат директивы(режим MASM).CODE [имя]Назначение.DATAНачало или продолжение сегмента инициализированныхданных. Также используется для определения данных типаnear 1.CONSTНачало или продолжение сегмента постоянных данных(констант) модуля.DATA?Начало или продолжение сегмента неинициализированныхданных. Также используется для определения данных типаnearSTACK [размер]Начало или продолжение сегмента стека модуля.
Параметр[размер] задает размер стека.FARDATA [имя]Начало или продолжение сегмента инициализированныхданных тина far.FARDATA? [имя]Начало или продолжение сегмента неинициализированныхданных типа farНачало или продолжение сегмента кодаНаличие в некоторых директивах параметра [имя] говорит о том, что возможноопределение нескольких сегментов этого типа. С другой стороны, наличие нескольких видов сегментов данных обусловлено требованием обеспечить совместимостьс некоторыми компиляторами языков высокого уровня, которые создают разныесегменты данных для инициализированных и неинициализированных данных,а также констант.При использовании директивы MODEL транслятор делает доступными несколько предопределенных идентификаторов, к которым можно обращаться во времяработы программы в целях получения информации о тех или иных характеристиках выбранной модели памяти (см.
ниже). Перечислим эти идентификаторы и ихзначения для транслятора TASM (табл. 5.4). Предопределенные идентификаторыMASM приведены в приложении Б (см. на сайте http://www.piter.com/download).Таблица 5.4. Идентификаторы, создаваемые директивой MODELИмя идентификатораЗначение переменной©codeФизический адрес сегмента кода©dataФизический адрес сегмента данных типа near©fardataФизический адрес сегмента данных типа farДирективы сегментации109Имя идентификатора©fardata?Значение переменнойФизический адрес сегмента неинициализированныхданных типа far©cursegФизический адрес сегмента инициализированных данныхтипа far©stackФизический адрес сегмента стекаЕсли вернуться к листингу 5.2, то можно увидеть пример использования одного из перечисленных идентификаторов, а именно @data. Цель его применения —получение значения физического адреса сегмента данных программы.В заключение обсуждения директивы MODEL отметим, что операнды директивыMODEL задают модель памяти, определяющей набор сегментов программы, размеры сегментов данных и кода, способы связывания сегментов и сегментных регистров.
В табл. 5.5 приведены некоторые значения параметров модели памяти директивы MODELТаблица 5.5. Модели памятиМодельTINYТип кодаnearТип данныхnearНазначение моделиКод и данные объединены в одну группус именем DGROUP. Используется длясоздания программ файлового формата СОМSMALLnearnearКод занимает один сегмент, данныеобъединены в одну группу с именемDGROUP. Эту модель обычно используютдля большинства программ на ассемблереMEDIUMfarnearКод занимает несколько сегментов, по одномуна каждый объединяемый программныймодуль. Все ссылки на передачу управленияимеют тип far. Данные объединены в однойгруппе; все ссылки на них имеют тип nearCOMPACT nearfarКод в одном сегменте; ссылки на данныеимеют тип farLARGEfarfarКод в нескольких сегментах, по одному накаждый объединяемый программный модульFLATnearnearКод и данные в одном 32-битном сегменте(плоская модель памяти)Параметр модификатор директивы MODEL позволяет уточнить некоторые особенности использования выбранной модели памяти (табл.
5.6).Таблица 5.6. Модификаторы модели памятиЗначениемодификатораНазначениеuse 16Сегменты выбранной модели используются как 16-разрядные(если соответствующей директивой указан процессор i80386или 180486)продолжение110Глава 5. Синтаксис ассемблераТаблица 5.6 (продолжение)ЗначениемодификатораНазначениеuse32Сегменты выбранной модели используются как 32-разрядные(если соответствующей директивой указан процессор i80386или J80486)dosПрограмма будет работать в MS-DOSНеобязательные параметры язык и модификатор_языка определяют некоторыеособенности вызова процедур.
Необходимость в использовании этих параметровпоявляется при написании и связывании программ на разных языках программирования. Этого вопрос будет подробнее обсужден в главе 15 при рассмотрениисредств модульного программирования на ассемблере.Описанные ранее стандартные и упрощенные директивы сегментации не исключают друг друга. Стандартные директивы используются, когда программистжелает получить полный контроль над размещением сегментов в памяти и их комбинированием с сегментами других модулей. Упрощенные директивы целесообразно использовать для простых программ, а также для программ, предназначенных для связывания с программными модулями, написанными на языках высокогоуровня. Это позволяет компоновщику эффективно связывать модули разных языков за счет стандартизации связей и управления.Таким образом, в ходе предыдущего изложения была описана структура программы на ассемблере.
Было показано, что программа разбивается на несколькосегментов, каждый из которых имеет свое функциональное назначение. Для такого разбиения используются директивы сегментации. Трансляторы TASM и М ASMпредоставляют два типа таких директив: стандартные и упрощенные. Далее в учебнике будут использоваться упрощенные директивы сегментации, если не появится необходимость в применении стандартных директив.Вторую часть главы мы посвятим вопросу описания данных в программе наассемблере и организации доступа к ним.Простые типы данных ассемблераЛюбая программа предназначена для обработки некоторой информации, поэтомувопрос о том, какие типы данных языка программирования доступны для использования и какие средства языка привлекаются для их описания, обычно встаетодним из первых.
Трансляторы TASM и MASM предоставляют широкий наборсредств описания и обработки данных, который вполне сравним с аналогичнымисредствами большинства языков высокого уровня.Понятие типа данных носит двойственный характер. С точки зрения размерности процессор аппаратно поддерживает следующие основные типы данных(рис. 5.17).« Байт — восемь последовательно расположенных битов, пронумерованных от Одо 7, при этом бит 0 является самым младшим значащим битом.Простые типы данных ассемблера111БайтСловоЦДвойное словоУчетверенное словоСтаршее словобтаршее двойное слово6347Старший : Младшийбайт: байтМладшее словоМладшее двойное слово31156331Упакованный тип данных12795ОРис.