Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

ОЭВМиС.Метод.Лабы

.pdf
Скачиваний:
14
Добавлен:
13.03.2016
Размер:
355.85 Кб
Скачать

выполняет прерывание 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.