Лабораторная работа по курсу "Организация ЭВМ и систем"
Программирование сопроцессора
Цель работы: познакомиться с особенностями работы сопроцессора и его командами.
1. Введение
Сопроцессор (FPU) работает с данными в следующих форматах:
•двоичные числа длиной 16, 32 и 64 бита;
•упакованные BCD числа - максимальная длина 18 десятичных цифр (80 бит);
•вещественные числа в коротком (32 бита), длинном (двойном, 64 бита) и расширенном (80 бит) форматах (рис. 1):
|
8 |
|
23 |
|
Короткий |
|
s |
Экспонента |
|
Мантисса |
|
||
|
|
формат |
||||
31 |
23 |
22 |
Неявная единичная целая |
0 |
||
Знак |
|
1 |
часть мантиссы |
|
||
|
|
|
||||
|
|
|
|
|
||
|
11 |
|
52 |
|
Длинный |
|
s |
Экспонента |
|
Мантисса |
… |
||
|
формат |
|||||
63 |
52 1 51 |
|
|
0 |
||
|
15 |
|
64 |
|
Расширенный |
|
s |
Экспонента |
1 |
Мантисса |
… |
||
формат |
||||||
79 |
64 63 |
Явная единичная целая |
0 |
|||
|
|
|
часть мантиссы |
|
||
|
Рис. 1. |
Форматы вещественных чисел |
|
Данные, передаваемые в сопроцессор, преобразуются в расширенный формат (80 бит), и записываются в регистр вершины стека сопроцессора. После обработки результат можно сохранить в памяти с преобразованием в один из перечисленных выше форматов.
Отладка программ выполняется в отладчике Turbo Debugger. Для отображения регистров сопроцессора выберите пункт меню View|Numeric processor (рис. 2).
|
|
|
Значение |
|
Значение в виде вещ.числа |
|
|||
|
|
|
|
|
|||||
|
|
|
|
в расширенном формате |
|
||||
|
Логический номер |
||||||||
Состояние |
|
|
|
|
|
|
|
|
|
|
|
Регистры стека |
|
Поля |
|||||
|
|
|
|
|
управления |
||||
|
|
|
|
|
|
|
|
(регистр cwr) |
|
|
|
|
|
|
|
|
|||
|
|
|
|
|
|
|
|
|
|
Рис. 2. Вид окна сопроцессора в отладчике
Ниже приведены поля регистра управления сопроцессором cwr. Маски:
•im (Invalid Operation Mask) - маска недействительной операции;
•dm (Denormaliized Operand Mask) - маска денормализованного результата;
•zm (Zero Divide Mask) - маска деления на нуль;
•om (Overflow Mask) - маска переполнения;
Флаги
состояния (регистр swr)
1
•um (Underflow Mask) - маска антипереполнения;
•pm (Precision Mask) - маска особого случая при неточном результате;
•iem - маска запроса на прерывание (для i8087).
Если значение какой-либо из перечисленных масок равно 1, то при возникновении исключения этого типа оно будет обрабатываться самим сопроцессором. Если значение маски равно 0, то при возникновении исключения этого типа будет возбуждено прерывание, которое должно быть обработано соответствующим обработчиком.
Управляющие биты регистра управления сопроцессором cwr:
•pc (Precision Control) определяют точность вычислений: 3 - используется расширенная точность; 2 - результат округляется до двойной точности; 0 - результат округляется до одинарной точности.
•rc (Rounding Control) определяет режим округления при выполнении операций с вещественными числами: 0 - округление к ближайшему целому; 1 - округление в направлении к отрицательной бесконечности; 2 - округление в направлении к положительной бесконечности; 3 - округление в направлении к нулю.
•ic (Infinity Control) - управление значением бесконечность.
Врегистре состояния swr (см. рис. 2) находятся флаги исключений, которые соответствуют тем же исключениям, что и маски регистра cwr (см. выше). Значение флага, равное единице, указывает на возникновение соответствующего исключения. Помимо флагов в swr находятся также поле st - указатель вершины стека, сс - код условия (устанавливается командами сравнения и другими командами сопроцессора), ir - запрос на прерывание.
2. Порядок выполнения лабораторной работы
Задание 1.
1.1. Выполните программу ex.asm (файл ex.asm):
model small |
100h |
|
.stack |
|
|
.data |
dt |
10 |
a |
||
b |
dw |
3 |
c |
dq |
1.3e-1 |
res |
dw |
0 |
.code |
|
ax, @data |
begin: mov |
||
|
mov |
ds, ax |
|
finit |
a |
|
fbld |
|
|
fild |
b |
|
fld |
c |
|
fmul |
|
|
fdiv |
|
|
fistp res |
|
exit: mov |
ax, 4c00h |
|
end |
int |
21h |
begin |
|
В отчете укажите а) форматы переменных a, b, c и res; б) по какой формуле вычисляется res? В комментарии к командам сопроцессора укажите назначение каждой команды и содержимое стека после выполнения команды (Пример: fbld a;загрузка BCD числа, ST0=a).
1.2. Выполните программу ex.asm в отладчике. Выпишите и расшифруйте в отчете биты результата, находящегося ST(0) (до его сохранения в res). Чему равен результат после его сохранения в res? Выполните программу в отладчике вторично. Перед сохранением результата установите управляющий бит rc равным 3. Чему равен res теперь и почему? Поясните в отчете.
Примечание 1. Для отображения содержимого регистров стека сопроцессора в шестнадцатеричном виде разверните окно сопроцессора на весь экран.
2
Примечание 2. В данной лабораторной работе для изменения значения управляющих битов и масок в регистре cwr используйте локальное меню отладчика.
1.3*. (Необязательное задание) Объясните в отчете, как маскирование исключений влияет на работу программы. Для этого специально создайте в программе какое-либо исключение при единичном и нулевом значении соответствующей маски в регистре cwr. Исследуйте следующие исключения:
1.Недействительная операция. Для вызова этого исключения передвиньте команду fmul на две строки вверх, в результате при умножении возникнет попытка чтения пустого стека.
2.Деление на ноль.
Укажите в отчете: какие флаги регистра swr сигнализируют о возникновении этих двух исключений; как обрабатываются исключения, когда маска=1 и маска=0.
Задание 2.
2.1. Составьте программу graph.asm построения графика функции в соответствии со своим вариантом (см. Приложение 2). Интервал изменения аргумента выберите самостоятельно. График должен располагаться примерно в центре экрана и иметь приемлемый размер. Отладьте и выполните программу. Результаты покажите преподавателю. Занесите в отчет содержимое регистров стека FPU в процессе выполнения команд сопроцессора.
Пример. Построить график функции y=sin(2t). Текст программы - в файле graph.asm.
.386 |
segment |
use16 |
|
data |
|||
x360 |
dd |
180.0 |
; константа перевода из градусов в радианы |
cnt |
dw |
360 |
; число вычисляемых точек графика |
color |
db |
12h |
; цвет - желтый |
x |
dw |
0 |
; текущие координаты точки |
y |
dw |
? |
; множитель 2 |
v2 |
dd |
2.0 |
|
scale |
dd |
100.0 |
; константа для масштабирования координаты y |
data |
ends |
|
|
code |
segment |
use16 |
|
|
assume |
|
cs:code, ds:data |
;********** Процедура изменения цвета пиксела (X,Y) **************
point proc
push |
CX |
|
; СХ - координата Х |
mov |
CX,x |
|
|
add |
CX,100 |
|
; DX - координата Y |
mov |
DX,y |
|
|
add |
DX,100 |
|
; АХ - № функции прерывания BIOS 10h |
mov |
AH,0Ch |
|
|
mov |
AL,color |
; AL - цвет пиксела |
|
mov |
BH,0 |
|
; BH - номер видеостраницы |
int |
10h |
|
|
pop |
CX |
|
|
ret |
|
|
|
point endp |
|
|
|
;******************** |
Главная процедура ************************** |
||
main proc |
AX,data |
|
|
mov |
|
||
mov |
DS,AX |
|
|
mov |
AH,0h ; № функции BIOS 10h - вывод пиксела |
||
mov |
AL,10h; № видеорежима - графический, 640х350 |
||
int |
10h |
; установка графического режима |
|
mov |
CX,cnt; загрузка счетчика цикла |
||
finit |
|
; инициализация сопроцессора |
|
fldpi |
x360 |
; загрузка числа пи |
|
fld |
; загрузка константы перевода |
||
fdiv |
|
; вычисление коэффициента перевода (пи/180) |
3
do: |
fstp |
x360 |
; |
и сохранение его в памяти |
fld |
x360 |
; |
загрузка коэффициента перевода |
|
|
fild |
x |
; |
загрузка угла в градусах |
|
fmul |
v2 |
; |
перевод его в радианы |
|
fld |
; |
загрузка множителя 2 |
|
|
fmul |
|
; |
вычисление аргумента для sin(2x) |
|
fsin |
|
; |
вычисление sin(2x) в ST(0) |
|
fld |
scale ; |
загрузка масштаба по y |
|
|
fmul |
y |
; |
умножить результат на масштаб |
|
fistp |
; |
запись коорд. y в память как целое с извлечением из стека |
|
|
call |
point |
; |
вывод точки на экран |
|
inc |
x |
; |
приращение угла на один градус |
|
loop |
do |
; цикл |
|
|
mov |
AH,1 |
; задержка до нажатия клавиши |
|
|
int |
21h |
||
|
mov |
ax, 4c00h |
||
main |
int |
21h |
; выход в DOS |
|
endp |
|
|
|
|
code |
ends |
|
|
|
stk |
segment |
stack 'STACK' |
||
stk |
db |
256 dup |
(0) |
|
ends |
|
|
|
|
end |
main |
|
|
|
2.2.* (Необязательное задание) Добавьте в график оси координат.
Требования к отчету
Отчет должен содержать:
1)Тексты программ ex.asm и graph.asm (для своего варианта) с комментариями, подготовленные до лабораторной работы (дома).
2)Описание всех экспериментов с требуемыми пояснениями.
Источники информации
1.Рудаков П.И., Финогенов К.Г. Язык ассемблера: уроки программирования. - М.: ДИАЛОГМИФИ, 2001. (Глава 1)
2.Юров В.И. Assembler: Специальный справочник. 2-е изд. - СпБ.: Питер, 2004.
ПРИЛОЖЕНИЕ 1. Команды сопроцессора, используемые в лабораторной работе
Название |
Число |
Назначение |
|
операндов |
|
FABS |
0 |
Абсолютное значение числа |
FADD |
0, 1, 2 |
Сложение двух действительных чисел |
FBLD |
1 |
Загрузка в вершину стека числа в BCD формате |
FBSTP |
1 |
Преобразование числа из вершины стека в BCD формат и выталкивание из |
|
|
стека в поле памяти |
FCHS |
0 |
Инвертирование знака числа, находящегося в вершине стека |
FCOS |
0 |
80387+ Вычисление косинуса числа из вершины стека. Аргумент - в радианах, |
|
|
его модуль не должен превышать 263 |
FDIV |
0, 1, 2 |
Деление двух действительных чисел |
FDIVR |
0, 1, 2 |
Деление двух действительных чисел в обратном порядке |
FINIT |
0 |
Инициализация сопроцессора |
FIST |
1 |
Преобразование числа из вершины стека в целое число и запись его в поле |
|
|
памяти |
FISTP |
1 |
Преобразование числа из вершины стека в целое число и запись его в поле |
|
|
памяти с выталкиванием из стека |
FLD |
1 |
Загрузка в стек действительного числа из поля памяти |
FLD1 |
0 |
Загрузка числа 1 в вершину стека |
FLDLG2 |
0 |
Загрузка в вершину стека числа ln2 (loge2) |
4
Название |
Число |
Назначение |
|
операндов |
|
FLDPI |
0 |
Загрузка числа π в вершину стека |
FLDZ |
0 |
Загрузка числа 0 в вершину стека |
FMUL |
0, 1, 2 |
Умножение двух действительных чисел |
FPTAN |
0 |
Вычисление тангенса угла, заданного в вершине стека |
FSIN |
0 |
80387+ Вычисление синуса числа из вершины стека. Аргумент - в радианах, |
|
|
его модуль не должен превышать 263 |
FSINCOS |
0 |
80387+ Одновременное вычисление синуса и косинуса. В STcos; в ST(1)-sin. |
|
|
Аргумент - в радианах, его модуль не должен превышать 263 |
FSQRT |
0 |
Вычисление квадратного корня |
FST |
1 |
Запись действительного числа из вершины стека в память |
FSTP |
1 |
Запись действительного числа из вершины стека в память с выталкиванием из |
|
|
стека |
FSUB |
0, 1, 2 |
Вычитание двух действительных чисел |
FSUBR |
0, 1, 2 |
Вычитание двух действительных чисел в обратном порядке |
FWAIT |
0 |
Ожидание окончания работы сопроцессора |
FXCH |
0, 1 |
Обмен содержимым вершины стека с указанным регистром стека |
ПРИЛОЖЕНИЕ 2. Варианты для программы graph.asm
ПК |
МП-20 |
МП-24 |
МП-24а |
МП-25 |
1 |
0.5sin(1.5x+2) |
y=sin(t+1) |
(1.2+x)/x2) |
x3-x+8.7 |
|
|
x=2.1t |
|
|
2 |
sin(x)/(cos(x)+1.1) |
x=sin(t2) |
cos(x-1)/sin(x) |
0.1tg(0.9x+1) |
|
|
y=cos(2.1t) |
|
|
3 |
cos((0.7+x)x) |
cos(x+0.9x3) |
sin(2x)+cos(3x) |
(ctg(x)+1)tgx |
4 |
cos(x+0.1x2) |
cos(x-0.8)+ x2 |
ln2(sin(1.2x)) |
sin(x)+cos(x) |
5 |
√|1.5x| + x2 |
1.1x+0.5x2 |
1.5+3.88(x2-1) |
sin(x/2.1)-cos(x) |
6 |
(1.2+x)/x2) |
1.5x2-3x-1 |
cos(x)/(sin(x)+1) |
sin(x-1)/2x |
7 |
cos(x-1)/(sin(x)+2) |
sin(1.9x)/(x-1.5) |
cos(x+2x2) |
sin(x)*cos(0.9x) |
8 |
sin(2x)+cos(3x) |
√|0.99x| + x |
1.5x2+x |
sin(0.27x)-cos(x) |
9 |
ln2(sin(1.2x)) |
√(3.45x2+0.1) |
sin(1.88x)cos(x) |
cos(|x|)/(sin(x)+2) |
10 |
1.5+3.88(x2-1) |
cos3(x)+tg(x) |
√(x3-5) +x |
sin(0.9x)+cos(x) |
11 |
cos(x)/(sin(x)+1.5) |
sin2(x/2 + 1) |
sin2(x)/(1+tg(x)) |
x2+3x-5 |
12 |
cos(x+0.9x3) |
√(3.45x2) |
(ctg(x)+1)tgx |
sin(1.5x)+sin(x) |
13 |
cos(x-0.8)+ x2 |
(x/2 + 1.5)(x+1) |
sin(x)+cos(x) |
sin((cos(x)+1.3)) |
14 |
√|0.99x| + x |
(x2+4)/sin(x) |
cos(x+0.9x3) |
√(x-1.2)/2x |
15 |
2x2+x-5 |
√|x-4ln2| |
cos(x-0.8)+ x2 |
x tg(x)/2 |
16 |
y=sin(t) |
√|x-1.1cos(x)| |
1.1x+5x2 |
y=sin(t+1) |
|
x=cos(t) |
|
|
x=1.3t2 |
17 |
sin(2x)*cos(x) |
x=cos(t)+1 |
1.5x2-3x-1 |
x=sin(t2) |
|
|
y=sin2(x) |
|
y=cos(2.1t+1.5) |
18 |
sin(2.27x)-cos(x) |
sin(1.88x)cos(x) |
sin(1.9x)/(x-1.5) |
cos(x+ ln2 ) |
19 |
cos(x)/sin(2x) |
√(x3-5) +x |
x2+3x-0.9 |
cos(x-0.8)+ x2 |
20 |
sin(0.99x)+cos(x) |
sin2(x)/(1+tg(x)) |
sin(1.5x)+sin(x) |
1.1x+0.5x2 |
21 |
sin(2.5x)-cos(x2) |
cos2(x)+tg(1.5x) |
sin((cos(x)+1.3)) |
|ln2-x| + 1.5 |
22 |
sin(1.5x)+cos(x) |
2√(x+1) |
cos(2x)+sin(3x) |
√(x5-5) |
23 |
sin((cos(x)+1.3)) |
(sin(x)+1)/2 |
sin2(x/2 + 1) |
1+2x-3x2 |
24 |
sin(t+1) x=2.123t |
(x+3)2-sin2(x) |
√(3.45x2) |
tg(x/2)+1 |
25 |
x=sin(t2) |
x=sin(1+t) |
sin(3x)-cos(x) |
x=cos(1.4t2) |
|
y=cos(2.1t) |
y=cos(2.1t) |
|
y=sin(2.1t) |
26 |
√|0.9x3| |
sin2(x)/(1+tg3(x)) |
3x2+4x-5 |
cos2(x) + tg(2x) |
---------------------------------------------------------------------------------------------------
© Лабораторная работа подготовлена Л.В. Илюшечкиной
5