ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 30.11.2023
Просмотров: 33
Скачиваний: 1
ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
ПРАКТИЧЕСКАЯ РАБОТА №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)
Вычитание.
Команда 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).
Декремент (уменьшение на 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).