ПРОСТЫЕ АРИФМЕТИЧЕСКИЕ ДЕЙСТВИЯ НА ЯЗЫКЕ АССЕМБЛЕРА

ЛАБОРАТОРНАЯ РАБОТА №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.