ФЕДЕРАЛЬНОЕ АГЕНТСТВО ПО ОБРАЗОВАНИЮ
РОССИЙСКОЙ ФЕДЕРАЦИИ ТУЛЬСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ
Кафедра электронных вычислительных машин
Лабораторная работа №3
по дисциплине
«ОРГАНИЗАЦИЯ ЭВМ И СИСТЕМ»
Вариант №2
Выполнили:
|
студенты группы 250261
Косухин К.Ю.
Лапшин Е.С.
Сафронова А.Д.
|
Проверил:
|
Лебеденко Ю.И.
|
Тула 2010
Цель и задачи работы
Изучение архитектуры и основ системы команд арифметического сопроцессора К1810ВМ87 (i8087). Получение навыков программирования сопроцессорной системы.
Теоретические положения
Арифметический сопроцессор (АСП) К1810ВМ87 является сопроцессором центрального процессора (ЦП) К1810ВМ86 (i8086) [1], ориентированным на выполнение арифметических операций над числами с плавающей точкой. Назначение и наименование большинства его выводов полностью совпадает с соответствующими выводами ЦП в максимальном режиме [2] (см. лаб. раб. №4). Остальные выводы имеют следующее назначение:
BUSY – выходной сигнал занятости – соединяется со входом TEST ЦП;
INT – выходной сигнал прерывания.
Выводы QS1, QS2 служат АСП для получения информации о состоянии очереди команд ЦП.
АСП может работать только совместно с ЦП, разделяя с ним общий поток команд, выбираемый из памяти центральным процессором и поступающий в оба процессора. ЦП имеет в своей системе команд команду ESC, которая содержит код внешней операции для АСП и (если необходимо) адрес операнда в памяти. Выполнение ЦП команды ESC заключается в вычислении, если необходимо, адреса операнда и фиктивном считывании слова данных по этому адресу. АСП контролирует выполняемый ЦП поток команд и, встретив команду ESC, запоминает ее физический 20-разрядный адрес операнда и первое слово данных. После этого АСП выполняет операцию параллельно с работой ЦП. Если АСП требуется операнд, то он выбирает оставшиеся слова из памяти посредством запросов цикла шины у ЦП по сигналу RQ/GT.
С начала выполнения команды АСП выставляет уровень BUSY=1, который используется для синхронизации с ЦП. Параллельная работа ЦП и АСП продолжается до тех пор, пока ЦП не потребуется получить результаты выполнения текущей операции в АСП или выполнить новую команду ESC. Перед выполнением соответствующего действия ЦП должен выполнить команду WAIT, которая переводит ЦП в состояние ожидания до тех пор, пока не будет получен сигнал TEST=0. Команда WAIT вставляется компилятором в программу автоматически.
АСП оперирует с числами в семи форматах (рис.1).
Формат директива определения данных
Целое слово (ЦС) 15 0
s |________ DW
Короткое целое (КЦ) 31 0
s |__________________ DD
Длинное целое (ДЦ) 63 0
s |____________________________________ DQ
Двоично-десятичное (ДД)79 0
s |0000000|d17 … _______________________…d0 DT
Короткое веществ. (КВ) 31 23 0
s |__E__|_____m______ DD
Длинное веществ. (ДВ) 63 52 0
s |____E____|_____________m____________ DQ
Временное веществ (ВВ)79 64 0
s |_____E_____|_______________m______________ DT
Рис.1. Форматы данных арифметического сопроцессора
Все форматы вещественных чисел имеют бит знака (s), поле порядка (E) и мантиссы (m). Обычно числа представлены в АСП в нормализованной форме, когда мантисса лежит в пределах от 1 до 2. Например, число, объявленное как короткое вещественное определяется как:
(-1)S (1, m1 m2 m3 …. m23 )2 E-127 .
Для объявления некоторого числа в вещественном формате в программе оно должно быть приведено с точкой. Например, переменные
var1 DQ - 4.0256
и var2 DQ 4.0
будут числами с плавающей точкой, а
var3 DQ 4
будет задано в целочисленном формате ДЦ.
В процессе обработки данных все операнды АСП хранятся в формате ВВ; в него они переводятся при загрузке в АСП и переводятся из него в исходный формат при сохранении в памяти.
АСП имеет стековую организацию блока регистров. Группа рабочих 80-битовых регистров заполняется операндами по стековому принципу (рис.2). Регистр ST(0) первым получает загружаемое число и передает предыдущее значение в ST(1) при загрузке следующего значения. Большинство арифметических операций используют вершину стека ST(0), этот регистр адресуется во многих командах неявно (по умолчанию). Команды с двумя операндами оперируют с регистрами ST(0) и ST(1), помещая результат в ST(0), если это не определено дополнительно.
79 64 0
ST(0) ________|_______________________
ST(1) ________|_______________________
ST(2) ________|_______________________
ST(3) ________|_______________________
.. ________|_______________________
.. ________|_______________________
ST(6) ________|_______________________
ST(7) ________|_______________________
Рис.2. Рабочие регистры арифметического сопроцессора
АСП имеет регистр управления CR (16-бит) и регистр состояния SR (16-бит). В регистре управления можно задавать режимы работы АСП с помощью установки бит управления бесконечностью (IC), управления округлением (RC), точностью (PC). В младшем байте CR содержатся общая маска запроса прерывания (IEM) и отдельные биты маскирования различных причин прерывания АСП: PM – неточный результат, UM – антипереполнение, OM - переполнение, ZM – деление на ноль, DM – денормализованный операнд, IM – недействительная операция. Регистр состояния служит для проверки условий по результату операций АСП. Его формат приведен на рис.3.
15 0
B | C3 | ‘ST’ | C2 | C1 | C0 || IR | | PE | UE | OE | ZE | DE | IE
Pис.3. Регистр состояния арифметического сопроцессора
Здесь младший байт отображает разные случаи причин прерывания от АСП (например, при делении на ноль ZE=1, при переполнении OE=1, и т.п.) Бит IR соответствует активному состоянию вывода INT (выход запроса прерывания от АСП, который соединяется обычно с одним из входов запроса контроллера прерываний).
В старшем байте 3-битовое поле ST указывает физический регистр, являющийся в данный момент вершиной стека. Бит В соотвествует выходному сигналу сопроцессора BUSY (занятость). Биты C3 – C0 показывают тип результата операции. В первую очередь необходимо запомнить значение битов C0 и C3, т.к. они часто используются для определения результата сравнения (таблица 1).
Таблица 1 Значения бит состояния АСП
Отношение операндов
|
C3
|
C0
|
ST(0) > X
|
0
|
0
|
ST(0) < X
|
0
|
1
|
ST(0) = X
|
1
|
0
|
ST(0) и X не сравнимы
|
1
|
1
|
Чтобы использовать сопроцессор в программе, достаточно включить команды АСП в ее текст. Все эти команды имеют мнемоническое обозначение, начинающееся с буквы ‘F’ (“floating-point”). Если следующая буква команды - ‘I’, следовательно, операция выполняется с целочисленным форматом. Другие буквы указывают на конкретную операцию. Например, команда FADD складывает два вещественных операнда; FISUB – вычитает одно целое число из другого. Базовая модель АСП i8087 имеет 68 мнемокодов, которые можно разделить на четыре группы: команды перемещения данных, арифметические команды, специальные вычислительные команды и команды управления. Обычно мнемокоды легки для понимания:
FLD – “load” (загрузка стека из памяти),
FST – “store” (сохранение из регистра в память),
FCOM – “compare”, (сравнение)
FSQRT – вычисление квадратного корня («square root») числа в ST(0)),
FSTSW – «store state word», (сохранить слово состояния) и т.д.
В конце команды может стоять суффикс ‘P’. Он означает, что операция выполняется с извлечение значения (pop) из регистра ST(0). После мнемокода операции записываются имена операнда получателя (destination) и источника (source). При отсутствии одного из них, он по умолчанию содержится в регистре ST(0), как было указано выше. Суффикс ‘R’ означает, что команда выполняется с переменой направления (reverse) источника и получателя. Например,
FDIV src : ST(0) ST(0) / src ,
FDIVR src : ST(0) src / ST(0) .
Большинство современных процессоров с архитектурой х86 имеют встроенный арифметический сопроцессор, который программно совместим с АСП i8087.
Оборудование
IBM – совместимая ПЭВМ, операционная система, поддерживающая MS-DOS, интегрированный отладчик Turbo Debugger , компилятор Ассемблера tasm.exe., компоновщик tlink.exe.
Задание на лабораторную работу
Изучить теоретические положения.
Разобрать программу, приведенную в приложении, которая выводит на экран номер ветви алгоритма вычисления функции v=f(x,y,z):
x2 - y2 +z , если x > y и z > 0; (1)
v = , если x < y и z > 0; (2)
x + y + z , если z < 0. (3)
И изменить ее, чтобы она рассчитывала формулу
v =
Результат выполнения работы
Изменив программу, получаем код:
sts1 segment para public 'stack'
DB 30 dup('stack')
sts1 ends
ds1 segment para public 'data'
x dq 1.0
y dq 3.0
z dq -4.0
stat dw (?)
v dq (?)
ds1 ends
cs1 segment para public 'code'
main proc far
assume cs:cs1, ds:ds1, ss:sts1
push ds
xor ax, ax
push ax
mov ax, ds1
mov ds, ax
fld qword ptr z
fld qword ptr y
ftst
; сохраняем stat для мат-процеесор
fstsw word ptr stat
; ждем
fwait
fld qword ptr x
mov ah, byte ptr stat+1
sahf
jb label1
mov ah, byte ptr y
ftst
sahf
jb label1
;____|z-x|___
; x = z - x
fsubr st(0), st(2)
; x = |x|
fabs
fadd
fwait
fstp qword ptr v
mov dx, '2'
jmp labelBreak
; __ y^2 - y ___
label1:
;x = 0
fsub st(0), st(0)
fwait
;x += y (x = 0)
fadd st(0), st(1)
fwait
;x *= y
fmul st(0), st(0)
fwait
;x -= y
fsub st(0), st(1)
fstp qword ptr v
mov dx, '1'
labelBreak:
mov ah, 2
int 21h
ret
main endp
cs1 ends
end main
На экране программа выводит:
2
Результаты исследования арифметического сопроцессора
№ п/п
|
Адрес
команды
|
Мнемокод команды
|
Машинный код
|
Операнд (имя и значение регистра или переменной в памяти)
|
Значение операнда после выполнения команды
|
1
|
0000
|
1E
|
push
|
ds:139F
|
ds:139F
|
2
|
0001
|
33C0
|
xor
|
ax, ax (ax:0000)
|
ax:0000
|
3
|
0003
|
50
|
push
|
ax:0000
|
ax:0000
|
4
|
0004
|
B8B913
|
mov
|
ax:0000, 13B9
|
ax:13B9
|
5
|
0007
|
8ED8
|
mov
|
ds:139F, ax:13B9
|
ds: 13B9, ax:13B9
|
6
|
0009
|
9B
|
wait
|
|
|
7
|
000A
|
DD061000
|
fld
|
qword ptr[0010]
|
|
8
|
000E
|
9B
|
wait
|
|
|
9
|
000F
|
DD060800
|
fld
|
qword ptr[0008]
|
|
10
|
0013
|
9B
|
wait
|
|
|
11
|
0014
|
D9E4
|
ftst
|
|
|
12
|
0016
|
9B
|
wait
|
|
|
13
|
0017
|
DD3E1800
|
fnstsw
|
word ptr[0018]
|
|
14
|
001B
|
9B
|
wait
|
|
|
15
|
001C
|
9B
|
wait
|
|
|
16
|
001D
|
DD060000
|
fld
|
qword ptr[0000]
|
|
17
|
0021
|
8A261900
|
mov
|
ah:13h, [0019]
|
ah:30h
|
18
|
0025
|
9E
|
sahf
|
|
|
19
|
0026
|
721F
|
jb
|
0047
|
|
20
|
0028
|
8A260800
|
mov
|
ah:30h, [0008]
|
ah:0h
|
21
|
002C
|
9B
|
wait
|
|
|
22
|
002D
|
D9E4
|
ftst
|
|
|
23
|
002F
|
9E
|
sahf
|
|
|
24
|
0030
|
7215
|
jb
|
0047
|
|
25
|
0032
|
9B
|
wait
|
|
|
26
|
0033
|
D8EA
|
fsubr
|
st:1, st(2):-4
|
st:-5, st(2):-4
|
27
|
0035
|
9B
|
wait
|
|
|
28
|
0036
|
D9E1
|
fabs
|
(st:-5)
|
(st:5)
|
29
|
0038
|
9B
|
wait
|
|
|
30
|
0039
|
DEC1
|
faddp
|
st(1):3, st:5
|
st(1):-4, st:8
|
31
|
003B
|
9B
|
wait
|
|
|
32
|
003C
|
9B
|
wait
|
|
|
33
|
003D
|
DD1E1A00
|
fstp
|
qword ptr[001A]
|
|
34
|
0041
|
BA3200
|
mov
|
dx:0000, 0032
|
dx:0032
|
35
|
0044
|
EB1A
|
jmp
|
0060
|
|
36
|
0060
|
B402
|
mov
|
ah:0, 02
|
ah:2
|
37
|
0062
|
CD21
|
int
|
21
|
|
38
|
0064
|
CB
|
retf
|
|
| |