- •Содержание
- •1.Введение в архитектуру эвм. 5
- •2.Архитектура реального режима работы м/п семейства 8086 19
- •3.Директивы и операторы ассемблера 81
- •4.Архитектура и система команд арифметического сопроцессора 91
- •5.Варианты контрольных работ 131
- •6.Примеры программ 138
- •1.Введение в архитектуру эвм.
- •2.Архитектура реального режима работы м/п семейства 8086
- •2.1.Форматы данных микропроцессора
- •2.1.1.Числа
- •2.1.2.Символы
- •2.1.3.Указатели
- •2.1.4.Цепочки
- •2.2.Адресация памяти
- •2.3.Внутренние регистры процессора
- •2.3.1.Регистры общего назначения
- •2.3.2.Сегментные регистры
- •2.3.3.Регистры смещения
- •2.3.4.Регистр флагов
- •2.4.Режимы адресации
- •2.4.5.Базовая адресация
- •2.5.1.1. Общие команды.
- •2.5.1.2. Команды push и pop .
- •2.5.1.3. Команды ввода-вывода.
- •2.5.1.4. Адресные команды (пересылки адреса)
- •2.5.1.5. Флажковые команды (команды пересылки флагов).
- •2.5.2.Арифметические команды.
- •2.5.2.1. Команды сложения.
- •2.5.2.2.Команды вычитания.
- •2.5.2.3.Команды умножения и деления.
- •2.5.2.4.Команды расширения знака.
- •2.5.2.5.Десятичная арифметика.
- •2.5.3.Логические команды.
- •2.5.3.1.Булевы команды.
- •2.5.3.2.Команды сдвигов.
- •2.5.3.3.Команды циклических сдвигов.
- •2.5.3.4.Команды двойного сдвига
- •2.5.3.5.Команды работы с двоичными цепочками
- •2.5.4.Команды передачи управления.
- •2.5.4.1.Команды безусловной передачи управления.
- •2.5.4.2. Команды условных переходов.
- •2.5.4.3.Команды SetCondition
- •2.5.5.Цепочечные (строковые) команды.
- •2.5.5.1.Команды пересылки цепочки.
- •2.5.5.2.Команды сравнения цепочек.
- •2.5.5.3.Команды сканирования цепочек.
- •2.5.5.4.Команды загрузки.
- •2.5.5.5.Команды ввода и вывода цепочек.
- •2.5.5.6.Замена сегмента.
- •2.5.6.Команды управления микропроцессором.
- •2.5.6.1.Команды управления флагами.
- •2.5.6.2.Команды синхронизации.
- •2.5.6.3.Команда холостого хода.
- •2.5.6.4.Команды прерываний.
- •2.5.7.Новые команды микропроцессора 80486
- •3.Директивы и операторы ассемблера
- •3.1.Структура программы
- •3.2.Организация программы.
- •3.2.1. Модели памяти
- •3.2.2. Процедуры
- •3.2.3. Директивы задания набора допустимых команд
- •3.3.Примеры использования директив в программах типа .Exe и .Com.
- •4.Архитектура и система команд арифметического сопроцессора
- •4.1.Форматы чисел сопроцессора
- •4.1.1.`Целые числа
- •4.1.2. Вещественные числа
- •4.1.3.Диапазоны вещественных чисел в х87.
- •4.2.Особые случаи вещественной арифметики
- •4.3.Формирование специальных значений в особых случаях
- •4.3.1. Случай неточного результата.
- •4.3.2.Численное антипереполнение.
- •4.3.3. Денормализованный операнд.
- •4.3.4. Деление на ноль.
- •4.3.5.Численное переполнение.
- •4.3.6.Недействительная операция.
- •4.4.Регистры математического сопроцессора.
- •4.4.1.Численные регистры (регистровый стек).
- •4.4.2.Регистр управления (cw)
- •4.4.3.Регистр состояния.
- •4.4.4. Регистр тэгов (признаков).
- •4.4.5.Указатели особого случая.
- •4.5.Система команд арифметического сопроцессора.
- •4.5.1.Команды передачи данных.
- •4.5.2.Арифметические команды
- •4.5.3.Дополнительные арифметические команды
- •4.5.4.Команды сравнений
- •4.5.5.Трансцендентные команды
- •4.5.6.Административные команды
- •4.6.Совместная работа двух процессоров в системе.
- •4.6.1.Синхронизация по командам.
- •4.6.2.Синхронизация по данным.
- •5.Варианты контрольных работ
- •5.1.Контрольная работа №1
- •5.2. Контрольная работа №2
- •6.Примеры программ
- •Список рекомендуемой литературы
5.2. Контрольная работа №2
Ввести с клавиатуры границы интервала значений аргумента функции, перевести их в формат вещественного числа, рассчитать шаг и вычислить значение функции в заданном интервале. Вывести на экран график функции, таким образом, чтобы он весь умещался на экране, для чего произвести масштабирование вычисленных значений функции в соответствии с размерами экрана в выбранном графическом режиме.
Y = sin 2x + cos4 x.
Y = (cos 2x + sin x)/2.
Y = sin 2x + cos3 x.
Y = (cos 2x + sin3 x)/3.
Y = (x* sin3 x)/5.
Y = x* cos 2x * sin 2x.
Y = (x2 * sin x)/2.
Y = x2 * cos2 x* sin x.
Y = x3 * sin x* cos x.
Y = (x3 * cos3 x)/3.
Y = x3 * cos x * sin3 x.
Y = 3*cos 2x* x4.
Y =4*sin 3 x*x.
Y = 2*cos 3 x* x2.
Y = x* sin 2 x + x2* cos x.
Y = x* cos2 x+ x3* sin 3 x.
Y = (sin x + x 2)/2.
Y =2* (cos2x +x 2).
Y = x* (sin2 x + x)/2
Y = 2x* (cos2x +x 2)
Y = x2 *(cos x +x).
Y = x2 *(sin x + x)/2.
Y = x3 *(sin x + cos x).
Y = x3 *(sin x + cos x)2.
Y = x2 *(cos x +x)2.
Y = x2 *(sin x +x)3.
6.Примеры программ
;Программа очистки экрана через видеобуфер
.model small
.486
.stack 100h
.code
begin: mov ax,@data
movds,ax
movax,0b800h; адрес видеобуфера текстовых режимов
moves,ax; настройка регистраesна видеобуфер
movdi,00h; настройка регистраdiна начало видеобуфера
movax,0700h; определение атрибутов фона и символа: черный фон , белый символ
mov cx,2000; счетчик числа выводимых символов- выводим на экран 2000 пробелов
rep stosw
movax,4c00h; вызов функции завершения программы
int 21h
end begin
;*****************************************************************
;Программа демонстрации суммирования элементов двух массивов целых чисел
.model small
.486
.stack 100h
.data
M1db1,2,3,4,5; первый исходный массив
M2db6,7,8,9,10;второй исходный массив
M3db5dup(0); массив результата
.code
begin:movax,@data; настройка сегментного регистраds
movds,ax; на сегмент данных
xordi,di;обнуление индексного регистра
movcx,5;определение счетчика цикла
met:moval,M1[di];пересылка элемента М1 в регистр
addal,M2[di];суммирование элементов массивов
movM3[di],al;запись в память результата
incdi; увеличение индекса элемента массива
loopmet; возврат на цикл
kon: mov ah,4ch
int 21h
end begin
;*****************************************************************
;Программа перекодировки символов из 16 системы счисления в ASCIIилиBCDкод
.model small
.486
.stack 100h
.data
SH db 0h,1h,2h,3h,4h,5h,6h,7h,8h,9h,0ah,0bh,0ch,0dh,0eh,0fh
ASCII db '0123456789abcdef'
BCD db 0,1,2,3,4,5,6,7,8,9,10h,11h,12h,13h,14h,15h
.code
begin: mov ax,@data
mov ds,ax
moval,SH[3]; загрузка 3 элемента массива вal
movdl,al; пересылка его вdl
leabx,ASCII; настройка адреса массиваASCIIкодов на регистрbx
xlat; перекодировка: вalвместо 16 кода –ASCII-код
movch,al; сохранение его вch
moval,dl; восстановление 16 кода вal
leabx,BCD; настройка регистраbxна адрес массиваBCD
xlat; перекодировка: вalвместо 16 кода –BCD-код
movcl,al; сохранение его вcl
movah,4ch; завершение программы
int 21h
end begin
;****************************************************************
;Программа ввода и перевода вещественных границ интервала определения функции
.Model Small
.486
.Stack 200h
.Data
bufdb18; буфер для ввода вещественного числа
db0;MSDOSвозвращает число введенных символов
db18dup(0) ; максимальный размер вводимой строки
ten dw 10; константа 10
XL dq 0 ; левая граница интервала
XP dq 0 ; правая граница интервала
mes1db13,10,' Введите левую границу' ,13,10,'$'
mes2db13,10,' Введите правую границу' ,13,10,'$'
mes3db13,10,' Левая граница не может быть равна правой!',13,10,'$'
mes4db13,10,' Левая граница не может быть больше правой!',13,10,'$'
cdw0; переменная для двоичного кода одной цифры числа
;*********************************************************
.Code
GRANPROC; Процедура ввода и перевода вещественного числа
pusha
vvod:
movah, 0Ah; вызов системной функции для ввода строки
lea dx, buf
int 21h
fldz; загрузка в стек сопроцессора 0
movsi, 2; настройкаsiна первый символ введенной строки в буфере
cmpbuf[si],'-'; первый символ - минус?
jeM1; да – переход наM1
cmpbuf[si],'+'; первый символ – плюс?
jneM2; если нет – то переход наM2
M1:incsi; переход к следующему символу в строке
M2:cmpbuf[si],'.'; очередной символ – десятичная точка
jeDrob; если да – то переход на обработку дробной части
cmpbuf[si],0dh; иначе – сравнение с кодом клавишиEnter– признак конца строки
jeKon_enter; если да – то переход на меткуKon_enter
cmpbuf[si],'0'; иначе – проверка: символ это цифра?
jbvvod; если код символа меньше кода нуля – то повторный ввод
cmp buf[si],'9';
javvod; если код символа больше кода девяти – то повторный ввод
moval,buf[si]; если цифра – то загрузить ее код вal
subal,'0'; перевод кода символа цифры в двоичный код
xorah,ah; обнуление регистра
movc,ax; сохранение двоичного кода цифры
fimulten; умножение числа в вершине стека на 10
fildc; загрузка кода цифры в вершину стека
fadd; сложение с предыдущей частью числа
incsi
jmpM2; переход к следующему символу в целой части числа
Drob:; обработка дробной части
fldz
xor bx,bx
movbl,buf[1]; загрузка вbxчисла введенных символов
movsi,bx; настройкаsiна последний символ
incsi
L1:; цикл обработки дробной части
mov al,buf[si]
cmpal,'.'; сравнение с кодом десятичной точки
jeKon_drob; если точка – то завершение обработки дробной части
cmpbuf[si],'0'; проверка кода символа на цифры
jb vvod
cmp buf[si],'9'
javvod
subal,'0'; перевод в двоичный код
xorah,ah
movc,ax; сохранение двоичного кода цифры
fildc; загрузка кода цифры в вершину стека
fadd; сложение с предыдущей дробной частью числа
fidivten; деление на 10
decsi
jmpL1; переход к следующей цифре
Kon_drob:fadd; сложение целой и дробной частей числа
Kon_enter:
cmpbuf[2],'-'; определение отрицательного числа
jneKon; если число положительное – то на меткуKon
fchs; иначе – инвертировать число в вершине стека
Kon:
popa
ret
GRAN endp
;*******************************************
Start:; начало основной программы
mov ax,@data
mov ds,ax
repeat:
finit; инициализация сопроцессора
movah,9; вывод первого сообщения
lea dx,mes1
int 21h
CallGRAN
fstXL; сохранение левой границы интервала
movah,9; вывод второго сообщения
lea dx,mes2
int 21h
CallGRAN
fstXP; сохранение правой границы интервала
fcom; сравнение левой и правой границ
fstswax; передача кодов условия в ЦП
fwait
sahf
jeravno; если границы равны – то ошибка
jbmenshe; если правая граница меньше левой – то ошибка
jmpend_progr; если границы введены верно – то выход из программы
ravno:
mov ah,9
lea dx,mes3
int 21h
jmp repeat
menshe:
mov ah,9
lea dx,mes4
int 21h
jmp repeat
end_progr:
mov ah,4ch
int 21h
End Start