ПРОСТЫЕ АРИФМЕТИЧЕСКИЕ ДЕЙСТВИЯ НА ЯЗЫКЕ АССЕМБЛЕРА
ЛАБОРАТОРНАЯ РАБОТА №9,10
Тема: СТРУКТУРА ИСПОЛНИМЫХ ФАЙЛОВ ТИПА *.EXE.
ПРОСТЫЕ АРИФМЕТИЧЕСКИЕ ДЕЙСТВИЯ НА ЯЗЫКЕ АССЕМБЛЕРА
Цель работы: Изучение принципов составления простейших*.exe программ. Изучение приемов работы с простейшими операторами арифметических действий.
Краткие теоретические сведения (программа типа *.ЕХЕ).
Файлы типа ЕХЕ содержат заголовок, в котором описывается размер файла, требуемый объем памяти, список команд в программе, использующих абсолютные адреса, которые зависят от расположения программы в памяти, и т.д. ЕХЕ-файл может иметь любой размер. Формат ЕХЕ также используется для исполнимых файлов в различных версиях DOS-расширителей и Windows, но со значительными изменениями.
Операционная система DOS не использует расширения для определения типа файла. Первые два байта заголовка ЕХЕ-файла — символы «MZ» или «ZM», и если файл начинается с этих символов и длиннее некоторого порогового значения, разного для разных версий DOS, он загружается как ЕХЕ, если нет — как СОМ.
ЕХЕ-программы немного сложнее в исполнении, но для них отсутствует ограничение размера в 64 килобайта, так что все достаточно большие программы используют именно этот формат. Конечно, ассемблер позволяет уместить и в 64 килобайтах весьма сложные и большие алгоритмы, а все данные хранить в отдельных файлах, но ограничение размера все равно очень серьезно, и даже чисто ассемблерные программы могут с ним сталкиваться.
Простой пример ЕХЕ-файла :
1. | .model small | ; сегмент стека размером в 256 байт |
2. | .stack 100h | ; сегмент стека размером в 256 байт |
3. | .code | ; сегмент кода, который содержит и данные. |
4. | Begin: | ; метка начала кода программы |
5. | mov ax,@data ; | ; сегментный адрес строки message помещается в DS |
6. | mov ds,ax | |
7. | mov dx,offset string | помещает в регистр DX смещение метки String относительно начала сегмента данных |
8. | mov ah,9 | ; помещаем номер функции DOS «вывод строки (9)» в регистр АН. |
9. | int 21h | ; функция DOS "вывод строки" |
10. | mov ax,4C00h | ; завершение программы типа - exe |
11. | int 21h | ; функция DOS "завершить программу" |
12. | .data | ; начало сегмента данных |
13. | string db "Privet", 0Dh,0Ah,'$' | ;cтрока с содержащая выводимые данные. |
14. | end begin | ; метка окончания кода программы |
В примере определяются три сегмента — сегмент стека директивой .STACK размером в 256 байт, сегмент кода, начинающийся с директивы .CODE, и сегмент данных, начинающийся с .DATA. При запуске ЕХE-программы регистр DS уже не содержит адреса сегмента со строкой string (он указывает на сегмент, содержащий блок данных PSP), а для вызова используемой функции DOS этот регистр должен иметь сегментный адрес строки. Команда MOV AX,@DATA загружает в АХ сегментный адрес группы сегментов данных @DATA, a MOV DS,AX копирует его в DS. Программы типа ЕХЕ должны завершаться системным вызовом DOS 4Ch: в регистр АН помещается значение 4Ch, в регистр AL помещается код возврата (в данном примере код возврата 0 и регистры АН и AL загружаются одной командой MOV AX,4C00h), после чего вызывается прерывание 21h.