Занятие 6
(Лабораторная работа N 5)
--------------------------
Тема: Исследование сопроцессора 16-,32-разрядного МП
Цели работы:
1.Изучить способы представления чисел с плавающей точкой в памяти МП
2.Изучить программную модель(структуру арифметического стека) сопроцессора и его назначение
3.Научиться составлять простые ассемблерные программы для сопроцессора и проверять их работо способность
4.Практически освоить использование в ассемблерных программах 32-регистров МП
5.Исследовать макроопределение WYDD вывода на экран 32-разрядных двоичных чисел
Основные вопросы для отработки
на занятии
-------------------------------------------
1. Форматы чисел с плавающей точкой,применяемые в современных МП фирмы Intel и их представление в памяти Двоичное вещественное число представляется в виде
(-1)_5s_0 * 1,..m..* 2_5p
где s - знак мантиссы(для положительной равен 0,
для отрицательной 1)
m - мантисса (m_41_0m_42_0m_43_0... m_423_0)
m_4i_0-значение i-го двоичного разряда мантиссы,
считая от запятой
p - смещенный порядок ( p=E-127)
В памяти это число представляется так:
адрес содержимое
Код поля TAG для каждого регистра означает:
00 - конечное число не равное нулю
01 - нуль
10 - NAN/_7+$_0 (NAN - Not a Number - не число)
11 - регистр пуст(иногда обозначают "e")
Некоторые особенности функционирования стека:
a). регистр ST(0),обозначаемый обычно просто ST,используется
в качестве аккумулятора;
б). аккумулятором может быть любой из восьми регистров ST(i),
на который указывает специальный указатель вершины стека;
в). при загрузке числа в аккумулятор ST его содержимое пере мещается в ST(1);
г). при извлечении числа из ST в память аккумулятор освобож дается;
д). каждая команда сопроцессора имеет свои особенности,кото рые необходимо изучить
перед использованием;
е). работа на сопроцессоре должна завершаться освобождением стека от чисел.
3. Для использования в программах 32-разрядных регистров сущест вуют специальные
директивы
.386 или .486
Пример 1. Составить программу для вычисления выражения
Z = X + Y,
где все числа вещественные и равны
X = 1.0
Y = 2.5
; Программа для выполнения действий
; над числами с плавающей точкой
; (используется сопроцессор)
; с макроопределением вывода на экран
; 32-разр.двоичных кодов WYDD.
; В программе реализовано выражение
; Z=X+Y
; Z=X+Y
;....................................
.model small
.386
.data
x dd 1.0
y dd 2.5
z dd ?
spc db 10,13,'$'
;----------------------------------------------------------
;Макроопределение вывода 32-разр. двоичных слов
на экран :
;----------------------------------------------------------
wydd macro wd ; слово в памяти или константа
local m11,m12
push eax
push ebx
push ecx
push edx
;............................
mov ecx,80000000h
mov ebx,dword ptr wd
;............................
m11: mov dx,31h
test ebx,ecx
jnz m12
mov dx,30h
;............................
m12: mov ah,2h
int 21h
;............................
shr ecx,1
jnz m11
;............................
mov dx,offset spc
mov ah,9
int 21h
;............................
pop edx
pop ecx
pop ebx
pop eax
;............................
endm
.code
.startup
fld x ; число X загружается в ST(0)
fld y ; число Y загружается в ST(0)
; а число X перемещается в ST(1)
fadd ;ST(0)=ST(0)+ST(1) и ST(1) освобождается
fstp z ;сумма отправляется в Z,а ST(0) освобождается
wydd z
.exit
end
Пример 2.
Вычислить Y = R*_7?_0x
.model small
.data
R dw 4
x dw 2
Y dw ?
.code
.startup
fild R ; ST(0)=R
fild x ; ST(0)=x, ST(1)=R
fsqrt ; ST(0)=sqrt(x)
fmulp ; ST(1)=ST(0)*ST(1),
; в команде умножения символ
; p означает выталкивание числа из ST(0)
; и перемещение числа из ST(1) в ST(0).
fistp Y ; посылка результата в Y после округления
.exit
end
4. Исследовать программу примера 1 при различных исходных данных,дополнив ее командами вывода величин X,Y.
текст программы:
|
||||
|
||||
|
||||
|
||||
|