Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
GOS / Дисциплины программистского цикла.doc
Скачиваний:
53
Добавлен:
09.05.2015
Размер:
1.51 Mб
Скачать

6. Представление разреженных матриц линейными массивами

Способы линейного упорядочение массива:

  1. построчное

  2. постолбцовое

для определения номера элемента массива в линейном упорядочении определим функцию расстановки.

A: array[1..m, 1..n] of ElemType;

При построчном упорядочении элементов этой матрицы . при постолбцовом:.

Разряженной называется матрица, большая часть элементов которой принимает некоторое стандартное значение(обычно 0).

Для нижняя прямоугольная матрица:

может быть представлена через следующее соотношение:

Index = ((i - 1) * i) DIV 2 + j

Представление разряженной матрицы на основе линейных массивов основано на использовании двух статически определенных массивов. В 1ом массиве хранятся сами значения элементов разряженной матрицы, а во 2ом – их положение в матрице.

Const

N = 20;

M = (n * n) DIV 2;

Type

VectE = array[1..m] of real;

VectC = array[1..m] of word;

Procedure InputA3(var VE:VectE;

var LC:VectC,

var s: word);

var

I, j : byte;

Elm : real;

Begin

Writeln(‘input matrix’);

S := 0;

For j := 1 to n do

For i := 1 to n do

begin

Readln(elm);

If elm <> 0 then

Begin

Inc(s);

VE[s] := elm;

Lc[s] := I + (j - 1) * n;

End;

End;

end;

procedure sumAB(var VEA, VEBm VEC : VectE;

var LCA, LCB, LCC : VectC;

var sa, sb, sc : word);

var

ka, kb, l, i, j : word;

begin

if sa = 0 then

begin

sc := sb;

LCC := LCB;

VEC := VEB;

end

else

if sb = 0 then

begin

sc := sa;

LCC := LCA;

VEC := VEA;

End

Else

Begin

ka := 1;

kb := 1;

sc := 0;

for j := 1 to n do

for i := 1 to n do

begin

l := I + (j – 1) * n;

if (l = LCA[ka]) and (l = LCB[kb]) then

begin

inc(sc);

VEC[sc] := VEA[ka] + VEB[kb];

Inc(ka);

Inc(kb);

LCC[sc] := l;

End

Else

If l = LCA[ka} then

Begin

Inc(sc);

VEC[sc] := VEA[ka];

Inc(ka);

LCC[sc] := l;

End

Else

If l = LCB[kb] then

Begin

Inc(sc);

VEC[sc] := VEB[kb];

Inc(kb);

LCC[sc] := l;

End;

end;

End;

end;

8. Номенклатура сегментных регистров и способы адресации в младших моделях процессоров Intel.

Регистр является локальной памятью микропроцессора(устройства, допускающего чтение и запись). Процессор имеет группу регистров общего назначения. Эти регистры могут быть использованы в арифметических, логических командах, операциях пересылки. Кроме того, они могут иметь специальное назначение.

Ax(Ah:Al) – сохранение результатов вычисления

Bx(Bh:Bl) – регистр базы, хранилище адреса

Cx(Ch:Cl) – регистр счетчика, служит в командах организации цикла местом, где хранится число повторений цикла

Dx(Dh:Dl) – регистр данных, имеет специальное применение в командах умножения и деления.

К содержимому этих регистров можно обратится как к 16-ти разрядному или к паре 8-ми битных.

SP- указатель стека. Он используется в командах работы со стеком.

BP- указатель базы, при работе со стеком для того, чтобы отмечать область стека, отличную от верхушки стека.

SI – регистр индекса источника. DI – регистр индекса приемника. SI и DI используются в командах работы с массивами или строками. К половине регистра нельзя обратиться.

Сегментными называются 16-ти разрядные регистры, которые используются для вычисления физического адреса. CS-сегментный регистр кода. DS – сегментный регистр данных. SS – сегментный регистр стека. ES – регистр дополнительного сегмента. Команда микропроцессора может занимать 1-6 байтов (количество операндов 0-2). Если команда работает с операндами, то операнд можно указывать: в самой команде(непосредственный операнд); в регистре (в команде указывается номер соответствующего регистра); операнд находится в ячейке памяти. Если в команде указываются физические адреса, то её общая длина сильно увеличивается.

Для сокращения кода адреса используется прием, который называется сегментированием.

Адрес произвольной ячейки в ОП отсчитывается не от самого начала ОП(не от 0), а от некоторой границы области в ОП, которую имеет смысл рассматривать в данной задаче.

Адрес = базовый_адрес + смещение.

Сегмент – это непрерывная область в ОП, начальный адрес которой кратен 16, а размер не превышает 64 Кб.

Параграф – участок ОП размером 16 байт, начальный адрес которого кратен 16.

Любой сегмент должен начинаться с какого-либо параграфа. Сегменты могут не перекрываться, частично перекрываться или полнгостью перекрываться. Начальные адреса сегментов хранятся в сегментных регистрах.

Физический адрес = Base * 16 + offset

Base – адрес сегмента

Offset – исполнительный адрес

Сдвиг влево на 1-ну 16-ричную цифру с дописыванием нулевой 16-ричной цифры в качестве крайней правой объясняется тем, что из-за того, что адрес сегмента всегда кратен 16-ти, то младшая цифра в сегментный регистр не пишется.

Варианты задания исполнительного адреса:

  1. прямая адресация: в команде указывается то смещение, которое соответствует началу размещения в памяти соответствующего операнда (считается, что все операнды находятся в сегменте данных, поэтому при вычислении адреса используется текущее содержимое регистра DS)

  2. косвенная адресация – смещение соответствующего операнда в сегменте содержится в одном из регистров микропроцессора. Таким образом, текущее содержимое регистра микропроцессора определяет исполнительный адрес того операнда, который бедт использоваться в команде.

Add ax, word ptr ds:[bx]

Add ax, word ptr[bx]

  1. стандартная адресация – в качестве регистра косвенной адресации для микропроцессора могут использоваться только регистры Bx, SI, DI, BP. Для первых 3-ч регистров их содержимое является смещением по отношению к сегменту данных. Регистр Bp определяет смещение в сегменте стека для вычисления адреса.

Относительная адресация: add ax, pole

Индексная адресация: add ax, pole[SI] (pole имеет относительный адрес, SI – адрес смещения относительно самого массива pole)