Язык Ассемблер. Практическая работа №3. Простые арифметические д. Структура исполнимых файлов типа . Exe
Скачать 360.07 Kb.
|
ПРАКТИЧЕСКАЯ РАБОТА №3 Тема: СТРУКТУРА ИСПОЛНИМЫХ ФАЙЛОВ ТИПА *.EXE. ПРОСТЫЕ АРИФМЕТИЧЕСКИЕ ДЕЙСТВИЯ НА ЯЗЫКЕ АССЕМБЛЕРА Цель работы: Изучение принципов составления простейших*.exe программ. Формирование умений работать с простейшими операторами арифметических действий. Теоретический материал Файлы типа ЕХЕ содержат заголовок, в котором описывается размер файла, требуемый объем памяти, список команд в программе, использующих абсолютные адреса, которые зависят от расположения программы в памяти, и т.д. ЕХЕ-файл может иметь любой размер. Формат ЕХЕ также используется для исполнимых файлов в различных версиях DOS-расширителей и Windows, но со значительными изменениями. Операционная система DOS не использует расширения для определения типа файла. Первые два байта заголовка ЕХЕ-файла — символы «MZ» или «ZM», и если файл начинается с этих символов и длиннее некоторого порогового значения, разного для разных версий DOS, он загружается как ЕХЕ, если нет — как СОМ. ЕХЕ-программы немного сложнее в исполнении, но для них отсутствует ограничение размера в 64 килобайта, так что все достаточно большие программы используют именно этот формат. Конечно, ассемблер позволяет уместить и в 64 килобайтах весьма сложные и большие алгоритмы, а все данные хранить в отдельных файлах, но ограничение размера все равно очень серьезно, и даже чисто ассемблерные программы могут с ним сталкиваться. Таблица 4 - Простой пример ЕХЕ-файла : 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. Простые арифметические операторы. Арифметические команды любого микропроцессора привлекают к себе наибольшее внимание. Каждый заинтересован в выполнении арифметических вычислений, и именно эти команды проделывают такую работу. Хотя их немного, они выполняют большинство преобразований данных, а микропроцессоре. В реальных же условиях арифметические команды занимают лишь малую часть всех исполняемых команд. Сложение. Команда ADD (Addition – сложение (гл. to add – сложить)) осуществляет сложение первого и второго операндов. Исходное значение первого операнда (приемника) теряется, замещаясь результатом сложения. Второй операнд не изменяется. В качестве первого операнда команды ADD можно указывать регистр (кроме сегментного) или ячейку памяти, в качестве второго - регистр (кроме сегментного), ячейку памяти или непосредственное значение, однако не допускается определять оба операнда одновременно как ячейки памяти. Операнды могут быть байтами или словами и представлять числа со знаком или без знака. Команду ADD можно использовать для сложения как обычных целых чисел, так и двоично- десятичных (с использованием регистра АХ для хранения результата). Команда воздействует на флаги OF, SF, ZF, AF, PF и CF. Команда Назначение Процессор ADD приемник, источник Сложение 8086 Примеры: mov al,10 ---> загружаем в регистр AL число 10 add al,15 ---> al = 25; al - приемник, 15 - источник mov ax,25000 ---> загружаем в регистр AX число 25000 add ax,10000 ---> ax = 35000; ax - приемник, 10000 - источник mov cx,200 ---> загружаем в регистр CX число 200 mov bx,760 ---> а в регистр BX --- 760 add cx,bx ---> cx = 960, bx = 760 (bx не меняется); cx - приемник, bx - источник Вычитание. Команда SUB (Subtraction – вычитание) вычитает второй операнд (источник) из первого (приемника) и помещает результат на место первого операнда. Исходное значение первого операнда (уменьшаемое) теряется. Таким образом, если команду вычитания записать в общем виде SUB операнд1, операнд2 то ее действие можно условно изобразить следующим образом: операнд1 - операнд2 -> операнд1 В качестве первого операнда можно указывать регистр (кроме сегментного) или ячейку памяти, в качестве второго - регистр (кроме сегментного), ячейку памяти или непосредственное значение, однако не допускается определять оба операнда одновременно как ячейки памяти. Операнды могут быть байтами или словами и представлять числа со знаком или без знака. Команда воздействует на флаги OF, SF, ZF, AF, PF и CF. Команда Назначение Процессор SUB приемник, источник Вычитание 8086 Примеры: mov al,10 sub al,7 ---> al = 3; al - приемник, 7 - источник mov ax,25000 sub ax,10000 ---> ax = 15000; ax - приемник, 10000 - источник mov cx,100 mov bx,15 sub cx,bx ---> cx = 85, bx = 15 (bx не меняется); cx - приемник, bx - источник Инкремент (увеличение на 1). Команда INC (Increment – инкремент) прибавляет 1 к операнду, в качестве которого можно указывать регистр (кроме сегментного) или ячейку памяти размером как в байт, так и в слово. Не допускается использовать в качестве операнда непосредственное значение. Операнд интерпретируется как число без знака. Команда воздействует на флаги OF, SF, ZF, AF и PF. Команда не воздействует на флаг CF; если требуется воздействие на этот флаг, необходимо использовать команду Add Op,l. Команда INC (Increment – инкремент) увеличивает на единицу регистр или значение операнда в памяти. Она эквивалентна команде ADD источник, 1 только выполняется гораздо быстрее. Команда Назначение Процессор INC приемник Увеличение на единицу 8086 Примеры: mov al,15 inc al ---> теперь AL = 16 (эквивалентна add al,1) mov dh,39h inc dh ---> DH = 3Ah (эквивалентна add dh,1) mov cl,4Fh inc cl ---> CL = 50h (эквивалентна add cl,1) Декремент (уменьшение на 1). Команда DEC (Decrement – декремент) вычитает 1 из операнда, в качестве которого можно указывать регистр (кроме сегментного) или ячейку памяти размером как в байт, так и в слово. Не допускается использовать в качестве операнда непосредственное значение. Операнд интерпретируется как число без знака. Команда воздействует на флаги OF, SF, ZF, AF и PF. Она эквивалентна команде SUB источник, 1 только выполняется гораздо быстрее. Команда Назначение Процессор INC приемник Увеличение на единицу 8086 Примеры: mov al,15 dec al ---> теперь AL = 14 (эквивалентна sub al,1) mov dh,39h dec dh ---> DH = 38h (эквивалентна sub dh,1) mov cl,4Fh dec cl ---> CL = 4Dh (эквивалентна sub cl,1) Задание для выполнения: 1. Запустить эмулятор EMU8086. 2. Получите задание у преподавателя и, пользуясь правилами оформления ассемблерных программ, напишите программы расчета значения A. 3. Программу ассемблируйте в файл типа *.exe; Порядок выполнения: 1. Изучить теоретический материал. 2.Составить программу. 3.Оформить отчет. Таблица 1- Расчетные формулы № вар. Расчетная формула B C D 1. A=B+C-D 1 35 23 2. A=B+C+D 65 1 1 3. A=C-D+B 1 33 1 4. A=D+A-B 18 1 88 5. A= B-C+D 45 10 1 6. А=B-C+D 100 50 8 По согласованию с преподавателем можно изменить как расчетную формулу, так и значения коэффициентов (B, C, D). |