ОЭВМиС.Метод.Лабы
.pdfвыполняет прерывание INT 19H для доступа к первому сектору диска, содержащему блок начальной загрузки. Этот блок представляет собой программу, которая считывает системные файлы IBMBIO.COM, IBMDOS.COM и COMMAND.COM с диска в память. После этого память имеет следующее распределение:
•Таблица векторов прерываний
•Данные BIOS
•IBMBIO.COM и IBMDOS.COM
•Резидентная часть COMMAND.COM
•Доступная память для прикладных программ
•Транзитная часть COMMAND.COM
•Конец RAM (ОЗУ)
•ROM BASIC
•ROM BIOS
Внешние устройства передают сигнал внимания через контакт INTR в процессор. Процессор реагирует на этот запрос, если флаг прерывания IF установлен в 1 (прерывание разрешено), и (в большинстве случаев) игнорирует запрос, если флаг IF установлен в 0 (прерывание запрещено).
Операнд в команде прерывания, например, INT 12H, содержит тип прерывания, который идентифицирует запрос. Для каждого типа система содержит адрес в таблице векторов прерываний, начинающейся по адресу 0000. Так как в таблице имеется 256
четырехбайтовых элементов, то она занимает первые 1024 байта памяти от шест.0 до шест.3FF. Каждый элемент таблицы указывает на подпрограмму обработки указанного типа прерывания и содержит адрес кодового сегмента и смещение, которые при прерывании устанавливаются в регистры CS и IP соответственно.
Прерывание заносит в стек содержимое флагового регистра, регистра CS и регистра IP. Например, для прерывания 12H (которое возвращает в регистре AX размер памяти) адрес элемента таблицы равен шест.0048 (шест.12 х 4 =
шест.48).
Операция выделяет четырехбайтовый элемент по адресу шест. 0048 и заносит два байта в регистр IP и два байта в регистр SS. Адрес, который получается в регистровой паре CS:IP, представляет собой адрес начала подпрограммы в области BIOS, которая получает управление. Возврат из этой подпрограммы осуществляется командой IRET (Interrupt Return), которая восстанавливает флаги и регистры CS и IP из стека и передает управление на команду, следующую за выполненной командой прерывания.
Список прерываний
Адрес |
|
Функция прерываний |
(шестн) |
|
(шестн) |
0-3 |
0 |
Деление на нуль |
4-7 |
1 |
Пошаговый режим (трассировка DEBUG) |
8-B |
2 Немаскированное прерывание (NMI) |
|
C-F |
3 Точка останова (используется в DEBUG) |
10-13 |
4 Переполнение регистра |
|
14-17 |
5 Печать экрана |
|
18-1F |
6,7 Зарезервировано |
|
20-23 |
8 Сигнал от таймера |
|
24-27 |
9 Сигнал от клавиатуры |
|
28-37 A,B,C,D Используются в компьютерах AT |
||
38-3B |
E Сигнал от дискетного дисковода |
|
3C-3F |
F Используется для принтера |
|
40-43 |
10 |
Управление дисплеем |
44-47 |
11 |
Запрос оборудования |
48-4B |
12 Запрос размера памяти |
|
4C-4F |
13 Дисковые операции ввода-вывода |
|
50-53 |
14 |
Управление коммуникационным адаптером |
54-57 |
15 |
Кассетные операции и спец. функции AT |
58-5B |
16 Ввод с клавиатуры |
|
5C-5F |
17 Вывод на принтер |
|
60-63 |
18 |
Обращение к BASIC, встроенному в ROM |
64-67 |
19 |
Перезапуск системы |
68-6B |
1A Запрос и установка времени и даты |
|
6C-6F |
1B Прерывание от клавиатуры |
|
70-73 |
1C Прерывание от таймера |
|
74-77 |
1D Адрес таблицы параметров дисплея |
|
78-7B |
1E Адрес таблицы параметров дисковода |
|
7C-7F |
1F Адрес таблицы графических символов |
|
80-83 |
20 |
Нормальное завершение программы (DOS) |
84-87 |
21 |
Обращение к функциям DOS |
88-8B |
22 Адрес обработки завершения задачи (DOS) |
|
8C-8F |
23 Адрес реакции по Ctrl/Break (DOS) |
|
90-93 |
24 |
Адрес реакции на фатальную ошибку (DOS) |
94-97 |
25 |
Абсолютное чтение с диска (DOS) |
98-9B |
26 Абсолютная запись на диск (DOS) |
|
97-9F |
27 Создание резидентной программы (DOS) |
AO-FF 28-3F Другие функции DOS 100-1FF 40-7F Зарезервировано
200-217 80-85 Зарезервировано для BASIC
218-3C3 86-F0 Используются BASIC-интерпретатором 3C4-3FF F1-FF Зарезервировано
Примечание: Прерывания 00-1F относятся к BIOS, прерывания 20-FF относятся к DOS
Лабораторная работа №5: Способы адресации
Цель работы: Изучение способов адресации CISC-процессора
Задачи: определить способы адресации используемы в программе. Написать альтернативный вариант программы.
Используемые программные средства: Borland C++ 3.1
Порядок выполнения работы
1)В текстовом редакторе среды Borland C++ напишите программу, исходный текст которой приводится в листинге. Программа заносит в
видеопамять текстового экрана символ ‘1’, символ ‘2’ и 100 символов ‘3’ серым цветом по черному фону.
// Изучение режимов адресации i80x86
#include <conio.h>
void main() |
|
{ |
|
int a=0x0731; |
// серый цвет на черном фоне (0x07), символ ‘1’ (0x31) |
clrscr(); |
|
asm { |
|
mov ax,0xb800 |
|
mov es, ax |
// нельзя непосредственно |
// загружать сегментные регистры |
|
mov di,0 |
|
lea bx, a |
|
mov ax,[bx] |
|
mov [es:di],ax |
|
inc di |
|
inc di |
|
push ds |
|
push es |
|
pop ds |
|
inc ax |
|
mov [di], ax |
|
pop ds |
|
inc di |
|
inc di |
|
inc ax |
|
mov cx,100 |
// счетчик цикла |
rep stosw |
// записать '3' в следующие 100 символов |
} |
|
while(!kbhit());
}
2)Создайте исполняемый файл (F9).
3)Поставьте точку остановки на первую строку после оператора asm (F8)
4)Запустите программу до точки остановки (F9)
5)Откройте окно состояния процессора (Меню – Window – Register)
6)Пошагово (F8) выполните программу, наблюдая и записывая изменения содержимого РОН и флагов процессора при выполнении каждой команды.
7)Изучите прилагаемую к заданию информацию по командам и режимам адресации CISC-процессора Intel 80x86.
8)Определите, какой режим адресации в какой команде используется.
9)Предложите альтернативный вариант программы, определите для чего используются команды push и pop, можно ли обойтись без них в данной программе.
Контрольные вопросы и задания
1)Почему не будет выполнена команда “MOV x, y”?
2)Как переслать содержимое X в Y?
3)Чем отличаются команды
MOV [si], cx
и
MOV si, cx?
4)К какому способу адресации относится команда MOV dx, offset A (или, что то же самое, LEA dx, A)?
5)Что произойдет при выполнении инструкции
MOV AL, DS: 17h?
Чем эта команда отличается от следующей:
MOV AL, DS: [17h]?
6)Какие сегменты используются при следующих вариантах адресации:
[BX][SI], [BX][DI], [BP][SI], [BP][DI]?
Содержание отчета
1)Текст программы с комментариями
2)Описание используемых команд, объяснение смысла ее действия и используемых операндов
3)Содержимое регистров и флагов напротив соответствующих команд
4)Альтернативные вариант программы
5)Ответы на контрольные вопросы
Справочная информация
Режимом или способом адресации называют процедуру нахождения операнда.
Различают следующие режимы адресации:
•регистровый
•непосредственный
•прямой
•регистровый косвенный (базовый или индексный)
•регистровый косвенный со смещением (базовый или индексный)
•базовый индексный
•базовый индексный со смещением
Регистровый режим
Значение операнда-источника предварительно запоминается в одном из встроенных регистров микропроцессора. Сам регистр становится эффективным адресом. Операнд (байт или слово) находится в регистре. Этот способ применим ко всем программно-адресуемым регистрам процессора:
inc CX; |
Увеличение на 1 содержимого CX |
push DS; |
Сегментный адрес сохраняется в стеке |
xchg BX,BP; |
Регистры BX и BP обмениваются содержимым |
mov ES,AX; |
Содержимое AX пересылается в ES |
Непосредственный
Операнд указывается в команде. Операнд является частью команды. Он может иметь любой смысл: число, адрес, код символа ASCII.
mov AH,40h; |
Число 40h |
загружается в AH |
mov CL,'*"; |
Код ASCII символа * загружается в CL |
|
int 21h; |
Команда вызова прерывания 21h |
|
limit EQU 528; |
Число 528 |
теперь называется limit |
mov CX,limit; |
Число 528 |
загружается в CX |
Прямой
Адресуется память: адрес ячейки памяти указывается в команде: ; Сегмент данных
mem dw 0
Резервируется слово памяти ; Программный сегмент
inc mem; Содержимое этого слова увеличивается на 1
По умолчанию считается, что все данные адресуются через сегментный регистр DS, так что вместо этой команды можно было написать inc DS:mem Разрешается замена сегментного регистра. В этом случае его обязательно нужно указывать явно:
inc ES:mem
inc CS:mem
Заметьте, что это обращение к одной и той же ячейки памяти только в файле типа .COM. В исполняемых файлах других форматов это, скорее всего, будут различные ячейки. Можно обратиться к ячейке памяти по известному абсолютному адресу:
Загрузка в AL содержимого ячейки со mov AL,DS:17h смещением 17h в сегменте, определяемом
содержимым DS
Для увеличения читабельности такого кода mov AL,DS:[17h] константа, определяющая адрес, может быть
заключена в квадратные скобки
Регистровый косвенный (базовый или индексный)
Применяется в программах наиболее часто, благодаря своей гибкости. Смещение переменной в памяти берется из одного или двух адресных регистров. При вычислении смещения допускается указание смещения в команде.
С помощью регистрового косвенного режима адресации легко адресовать любой массив данных.
Адресуется память, слово или байт, с помощью регистра. В регистре хранится адрес операнда. При базовой адресации - это регистры BX или BP.
Если используются регистры DI или SI, то это индексная адресация. При использовании регистров BX, SI, DI подразумевается сегмент, адресуемый через DS. При использовании регистра BP подразумевается сегмент стека (регистр SS). Допускается замена регистра. Обозначение этого способа адресации:
[BX] (подразумевается DS:[BX])
[BP] (подразумевается SS:[BP])
[SI] (подразумевается DS:[SI])
[DI] (подразумевается DS:[DI])
Регистровый косвенный способ адресации удобно использовать тогда, когда к некоторой ячейке памяти необходимо обращаться неоднократно или нужно выполнять однотипные операции над различными ячейками. Примеры:
mov SI, offset datas; В SI загружается относительный адрес ячейки datas mov AX,[SI]; Содержимое ячейки datas загружается в AX
inc [SI]; Увеличиваться содержимое ячейки datas
mov BX,[SI]; Новое содержимое ячейки datas загружается в BX mov DI, SI; Относительный адрес ячейки datas копируется в DI
Регистровый косвенный со смещением (базовый или индексный)
Относительный адрес операнда вычисляется как сумма смещение = {SP, BP, DI, SI, BX} + смещение из команды.
Подразумеваются те же самые сегментные регистры, что и ранее. И точно так же допускается замена сегментного регистра.
Здесь обратите внимание на то, что квадратные скобки [ ] - это тоже оператор. Он вычисляет адрес как сумму того, что находится внутри скобок с тем, что находится снаружи.
Пусть в сегменте данных определен массив:
array db 0, 10, 20, 30, 40, 50, 60
Последовательность команд: mov BX,5
mov AL,array[5]
загрузит в AL элемент массива с индексом 5, то есть 50.
Тот же результат будет получен и в таких последовательностях команд: mov BX,offset array
mov AL,5[BX]
Или
mov AL,[BX]+5
mov AL,[BX+5]
Для инициализации BX можно использовать команду загрузки исполнительного адреса LEA:
lea BX,array
Базовый индексный со смещением
Адресуется память: байт или слово. Адрес операнда определяется как сумма содержимого двух регистров и смещения. Обозначение этого способа адресации:
смещение [BX][SI] |
(подразумевается DS:смещение [BX][SI]) |
смещение [BX][DI] |
(подразумевается DS:смещение [BX][DI]) |
смещение [BP][SI] |
(подразумевается SS:смещение [BP][SI]) |
смещение [BP][DI] |
(подразумевается SS:смещение [BP][DI]) |
Во всех этих случаях можно также писать:
смещение [BX+SI]
[смещение +BX+SI]
[BX+SI]+смещение
Подразумеваются те же самые сегментные регистры, что и ранее. И точно так же допускается замена сегментного регистра.
Пример. Пусть в сегменте данных определен массив из 24 байт: syms db 'ЙЦУКЕНГШЩЗХЪ'
'йцукенгшщзхъ' Последовательность команд
mov BX,12 mov SI,6
mov DL,syms[BX][SI]
загрузит в регистр DL элемент с индексом 6 из второго ряда, то есть код ASCII буквы “Г”.
Тот же результат будет получен и в таком варианте: mov BX,offset syms
mov SI,6
mov DL,12[BX][SI]
Лабораторная работа №6: Изучение команд MMX
Цель работы: Изучить расширение системы команд MMX процессоров Intel, Задачи: Составить программы для выполнения матричных (векторных) вычислений с использованием и без использования инструкций MMX и сравнить время их выполнения.
Используемые программные средства: Microsoft Visual C++ 6.0
Порядок выполнения работы
1)Рассмотреть пример программы вычисления скалярного произведения (см. листинг) с использованием MMX.
2)Прогнать программу несколько раз (5-10) и занести результаты прогона (времена выполнения модулей и коэффициент ускорения в таблицу).
Определить средние показатели в серии опытов. Проанализировать среднее значение ускорения и сравнить с теоретическим. Проанализировать причины расхождения с теоретическими оценками.
№ |
Время |
Время |
Коэффицие |
Отклонени |
п/ |
вычислений с |
вычислений |
нт |
е от |
п |
ММХ, мс |
без ММХ, мс |
ускорения |
среднего, |
|
|
|
К |
dK |
|
|
|
|
|
Листинг программы – примера на языке C (Microsoft Visual C++ 6.0)
#include "stdio.h" #include "windows.h"
int main(int argc, char* argv[])
{
short a_vect[16], b_vect[16]; short cnt = 16;
int res = 0, res1 = 0; int Time1, Time2, Delay1; double Speedup;
for (int i=0; i<16; i++)
{
a_vect[i] = 15; b_vect[i] = 7;
}
//printf("\nСкалярное произведение с ММХ и без...\n\n"); printf("\nScalar product with or without MMX...\n\n");
printf("\nResult = %d\n", res); printf("Result1 = %d\n", res1);
// Заметить время ...
Time1 = GetTickCount();
// Многократный прогон кода с MMX ...
for (i=0; i<10000000; i++)
{ |
|
cnt = 16; |
|
__asm |
|
{ |
|
push |
eax |
push |
ebx |
push |
ecx |
push |
esi |
xor |
esi, esi |
pxor |
MM7, MM7 |
loop1: |
|
movq |
MM0, a_vect[esi] |
movq |
MM1, b_vect[esi] |
pmaddwd MM0, MM1 |
|
paddd |
MM7, MM0 |
add |
esi, 8 |
sub |
cnt, 4 |
jnz |
loop1 |
movq |
MM0, MM7 |
psrlq |
MM7, 32 |
paddd |
MM7, MM0 |
movd |
res, MM7 |
emms |
|
pop |
esi |
pop |
ecx |
pop |
ebx |
pop |
eax |
} |
|
}
Time2 = GetTickCount();
//printf("\n C использованием ММХ ...\n"); printf("\n Using MMX ...\n"); printf("\nResult = %d", res);
Delay1 = Time2 - Time1;
printf("\nTime elapsed = %d ms\n", Delay1);
//Заметить время ...
Time1 = GetTickCount();
//Многократный прогон кода без MMX ...
for (i=0; i<10000000; i++)
{ |
|
|
|
|
cnt = 16; |
|
|
|
|
__asm |
|
|
|
|
{ |
|
|
|
|
push |
eax |
|
|
|
push |
ebx |
|
|
|
push |
ecx |
|
|
|
push |
esi |
|
|
|
xor |
esi, esi |
|
|
|
xor |
ecx, |
ecx |
|
|
loop2: |
|
|
|
|
mov |
ax, |
a_vect[esi] |
// |
Чтение из памяти |
mov |
bx, |
b_vect[esi] |
|
|
mov |
ax, |
15 |
// |
Непосредственная адресация |
mov |
bx, |
7 |
|
|
imul |
ax, |
bx |
|
|
add |
cx, |
ax |
|
|
add |
esi, |
2 |
|
|
sub |
cnt, |
1 |
|
|
jnz |
loop2 |
|
|
|
mov |
res1, ecx |
|
|
|
pop |
esi |
|
|
|
pop |
ecx |
|
|
|
pop |
ebx |
|
|
|
pop |
eax |
|
|
|
} |
|
|
|
|
} |
|
|
|
|
Time2 = GetTickCount();
//printf("\n Без использования ММХ ...\n"); printf("\n Without MMX ...\n"); printf("\nResult1 = %d", res1);
printf("\nTime elapsed = %d ms\n", Time2 - Time1); Speedup = float((Time2 - Time1))/float(Delay1);
printf("\nMMX SpeedUp = %10.4f times\n\n", Speedup); return 0;
}
Содержание отчета
1) Алгоритмы и тексты программ с использованием MMX и без использования ММХ
2)Заполненная таблица
3)Обязательно включить в отчет список используемой литературы.
Контрольные вопросы к отчету
1)Общая характеристика MMX-команд.
2)Назначение команды EMMS.
3)Где в процессоре располагаются MMX-регистры?
4)К какому классу команд относятся команды MMX?
5)Какое максимальное ускорение можно получить, используя MMX- команды?
6)Назначение команд MMX (где они могут применяться).
7)Расширения систем команд SSE, SSE2, 3DNow!
8)Классификация вычислительных систем по Флинну.
9)Общая характеристика векторных ВМ и процессоров.
10)Общая характеристика систолических структур.
11)Общая характеристика потоковых вычислительных систем.
Варианты заданий
По аналогии с примером написать самостоятельно программу для одного из вариантов задания:
1)умножение матриц;
2)вычисление матричного выражения A = B + kC, где A, B, C – матрицы, k – скалярный множитель;
3)нахождение суммы квадратов всех элементов матрицы;
4)поиск максимального элемента в матрице (двумерном массиве);
5)поиск заданного элемента в матрице (двумерном массиве);
6)нахождение суммы всех элементов матрицы;
7)вычитание матриц;
8)нахождение сумм по столбцам матрицы;
9)нахождение сумм по строкам матрицы;
10)свой вариант (например, обработка изображений и т.д.).
Впрограмме должны быть реализованы модули для решения заданной задачи с использованием MMX и без использования MMX с последующим сравнением времени выполнения каждого модуля при большом числе прогонов
иопределением ускорения при использовании MMX.