Главная | Обратная связь | Поможем написать вашу работу!
МегаЛекции

MySegment SEGMENT. Исполнительный файл типа EXE. Использование транслятора Turbo Assember




MySegment SEGMENT

    ORG 100h

    ASSUME CS: MySegment, DS: MySegment

Start:

    < команда>

   . . .

    < команда>

    < вызов_функции_завершения_программы>

    < данные>

   . . .

    < данные>

MySegment ENDS

    END Start

    Перед выполнением программы типа COM операционная система настраивает регистры CS, DS, ES, SS на начало физического сегмента, в котором размещаются коды и данные программы. Поэтому в дополнительной настройке эти сегментные регистры не нуждаются.

    Сегмент программы типа COM должен обязательно начинаться с команды, иначе компоновщик зафиксирует ошибку. Компоновщик также фиксирует ошибку, если в программе типа COM есть команды, в которых явным образом используются значения сегментных адресов программных сегментов. Например, команда

Code SEGMENT

. . .

MOV AX, Code

. . .

Code ENDS

будет являться ошибочной для программы типа COM, поскольку в регистр AX предпринимается попытка занести значение сегмента программного сегмента Code, а COM файл не имеет специальной информации для возможности выполнения этой команды.

Завершение программы типа COM можно выполнить командой RET, которая перейдет на адрес, указанный в вершине стека. Стек инициализируется операционной системой и в него записывается адрес ячейки памяти, находящейся в префиксе программного сегмента. Эта ячейка памяти содержит команду завершения программы.

 

Исполнительный файл типа EXE

    В исполнительном файле типа EXE физических сегментов может быть сколько угодно. Поэтому в программе типа EXE может быть любое число программных сегментов. Перед выполнением программы типа EXE операционная система настраивает регистр CS на сегмент, в котором находится точка входа в программу. Также операционная система настраивает регистр SS на стековый сегмент программы. Стековый сегмент может быть указан в программе явно с использованием ключевого слова STACK:

< имя_сегмента> SEGMENT PARA STACK

    DB < размер_стека> DUP (? )

< имя_сегмента> ENDS

При этом в сегменте определяется размер стека в байтах. Параметр сегмента “PARA” определяет выравнивание содержимого сегмента по границе параграфа, т. е. физический адрес первого элемента сегмента кратен 16. Это необходимое условия для организации стекового сегмента. Если такого явного указания сегмента стека в программе нет, то стековым сегментом считается тот программный сегмент, в котором определена точка входа в программу. При этом компоновщиком выдается предупреждение “Warning: No Stack”. В этом случае следует учесть, что размер программного сегмента с учетом возможного размера стека не должен превышать 64 Кб, так же как и в COM файле. Регистр SP инициализируется операционной системой значением 0, если сегмента стека в программе нет или значением, совпадающим с размером стекового сегмента, указываемым в программе. Регистр SS инициализировать не требуется.

Каждый сегментный регистр, который используется в директиве ASSUME, кроме CS, требуется настроить на начало того физического сегмента, в котором располагаются данные или коды, адресуемые с помощью данного сегментного регистра. Настройка может быть выполнена следующим образом:

MOV AX, < имя_сегмента>

MOV < имя_сегментного_регистра>, AX

    В файле типа EXE помимо кодов и данных программы имеется заголовок и специальная таблица настройки, которые в совокупности занимают не менее 512 байт. Размер таблицы настройки зависит от количества команд программы, в которых необходимо определять физический адрес того или иного программного сегмента. Например, последовательность команд настройки сегментного регистра, приведенная выше добавляет один элемент в таблицу настройки.

    В отличие от программы типа COM, в программе типа EXE могут использоваться команды вида

Code SEGMENT

. . .

MOV AX, Code

. . .

Code ENDS

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

    Пример программы типа EXE:

MyStack SEGMENT STACK

    DB 512 DUP (? ); стек размером 512 байт

MyStack ENDS

 

MyData SEGMENT

    < данные>

   . . .

    < данные>

MyData ENDS

MyCode SEGMENT

    ASSUME CS: MyCode, DS: MyData, SS: MyStack

Start:

    MOV AX, MyData

    MOV DS, AX

    < команды>

   . . .

    < команды>

    MOV AX, 4C00h        

    INT 21h         ; завершение программы

MyCode ENDS

    ENDS Start

Использование транслятора Turbo Assember

        

Использование транслятора Turbo Assembler одинаково для программ типа COM и EXE. Синтакс вызова транслятора:

TASM [ключи] < имя_исходного_файла> [, < имя_OBJ_модуля> ]

[, < имя_файла_листинга> ]

При вызове транслятора без опций и дополнительных имен файлов при успешном ассемблировании будет сгенерирован OBJ-модуль с именем, совпадающим с именем исходного файла и расширением OBJ. При указании имени исходного файла без расширения ищется файл с расширением ASM. Можно изменить имя генерируемого OBJ модуля его указанием через запятую после имени исходного файла. Расширение OBJ указывать не обязательно. Также транслятор имеет возможность сгенерировать файл листинга, в котором приводится исходный текст программы с указанием адресов команд, информация о переменных, сегментах и другая информация. Файл листинга генерируется при вызове транслятора с ключом /l. Имя файла листинга совпадает с именем исходного файла и имеет расширение LST. При задании другого имени файла листинга расширение LST указывать не обязательно. В таблице 1 приведены наиболее часто используемые ключи транслятора Turbo Assembler и их назначение.

                 

Таблица 1

Ключи транслятора Turbo Assembler

Ключ Назначение
/l Генерация файла листинга
/w0 отключение предупреждений
/w1 включение предупреждений
/z выдача строки исходного текста при появлении ошибки или предупреждения
/zi Генерация OBJ-модуля с отладочной информацией

 

Генерация OBJ-модуля с отладочной информацией позволяет затем просматривать в отладчике не машинные команды, а строки исходного текста программы.

    Примеры использования транслятора Turbo Assembler:

Поделиться:





Воспользуйтесь поиском по сайту:



©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...