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

1 курс 2 семестр / лекции / Лекция 4 Условные опреат массив  — копия

.pdf
Скачиваний:
7
Добавлен:
07.06.2023
Размер:
1.1 Mб
Скачать

3. Массивы.

Массивы удобно использовать для доступа к большому количеству однородных или сходных данных. Массив располагается в ячейках памяти со строго последовательными адресами и занимает непрерывный участок памяти. Каждый массив состоит из последовательности элементов одинакового размера, и

каждый элемент массива имеет порядковый номер, называемый индексом.

Показан массив (array ) из пяти элементов – целых чисел.

Элементы имеют индексы от 0 до 4. Массив хранится в оперативной памяти, начиная с базового адреса 0x10007000. Базовый адрес определяет адрес самого первого элемента массива, array[0].

Алгоритм формирования массива:

Массив состоит из 5 элементов. Формирование массива происходит за счет умножения каждого элемента на 8

Примечание : инструкция lwi – загрузка постоянного числа в старшие 16 бит регистра

Регистр $s0 резервируем для базового адреса массива Определение lwi базового адреса

массива

Чтение нулевого элемента массива Изменение величина нулевого элемента массива умножением на 8

Сохранение величина нулевого элемента массива.

Чтение нового первого элемента массива по новому адресу

Изменение величина первого элемента массива умножением на 8 Сохранение величина первого элемента массива.

и т.д.

Базовый адрес загружается в $s0.

Инструкции загрузки константы в старшие 16 бит (lwi ) и побитовое логическое «ИЛИ» с константой (ori) можно использовать для загрузки 32-битной константы в регистр.

Инструкция lw загружает элемент массива по адресу путем сложения базового адреса и смещения.

Базовый адрес указывает на начало массива, а смещение используют для доступа к последующим его элементам. Так, например, элемент array[1] хранится в памяти по адресу 0x10007004,т.е. на одно слово дальше, чем array[0], поэтому доступ к нем осуществляется со смещением 4 от базового адреса.

Когда необходим доступ ко многим элементам массива используют цикл for для умножения на 8 всех элементов массива, состоящего из 1000 элементов и находящегося в памяти по базовому адресу 0x23B8F000.

Address

Data

23B8FF9C array[999] 23B8FF98 array[998]

-

-

23B8F004

 

array[1 ]

23B8F000

 

array[0]

1.Код на языке ассемблера MIPS

# $s0 = array base address, $s1 = i # initialization code Резервируем $s0 для базового адреса и $s1для переменной i

lui

$$s0, 0x23B8

# $s0 = 0x23B

Lwi

 

 

 

 

ori

$s0, $s0, 0xF000 # $s0 = 0x23

addi $s1, $0, 0

 

# i = 0

 

 

addi $t2, $0, 1000

# $t2 = 1000

loop:

 

 

 

 

slt

$t0,

 

 

 

 

beq

 

 

$st0=1

done

sll

$t0,

 

 

 

offset)

add

 

 

 

 

array[i]

lw

 

 

 

 

 

sll

$t1,

 

 

 

8

sw

 

 

 

 

* 8

addi

 

 

 

 

j

loop

# repeat

цикл по i

done:

 

 

 

 

Формируем базовый адрес

адреса через переменую i

Формируем начальное значение переменной i

Формируем конечное значение переменной i в регистре st2

Примечание, новая инструкция:

Set On less than Slt: если $s1 < $t2 $t0 = 1; else $t0 = 0;

Если $t0 =$0, метка done – конец вычислений. Это произойдет когда $t0=0

Формирование нового адреса массива сдвигом значения в $s1 на 2 бита

Адрес нового элеиента массива: сложением $t0 -переменной величины и $s0 –

базового адреса нулевого элемента массива

Загрузка слова по новому адресу с новым базовым адресом регистра $t0 Формирование нового элемента массива умножением на 8

Сохранение нового элемента массива с новым базовым адресом $t0 Изменение индекса нового адреса массива

ПОЯСНЕНИЯ:

В качестве индекса массива теперь используется переменная i, поэтому вычисление смещения для адреса массива происходит в регистре $s1: в начале цикла происходит сдвиг переменной i на 2 бита, а в конце цикла увеличиваем переменную на 1 за счет команды addi $s1,$s1,1.

Каждый элемент нашего массива – это четырёхбайтовое слово.

Поскольку память адресуется побайтно, то смещение i-го элемента относительно базового адреса массива будет равно i*4.

Сумма этого смещения и базового адреса массива и даст адрес i-го элемента в памяти: add $t0,$t0,$s0

Байты и символы .

На англоязычной клавиатуре менее 128 символов, поэтому символы английского языка обычно хранятся не в целых машинных словах, а в восьмибитовых байтах, каждый из которых способен хранить до 256 различных значений.

В архитектуре MIPS определены инструкции для загрузки и сохранения байтов, необходимые для работы с индивидуальными байтами или символами данных:

загрузка байта без знака (lbu, от англ. load byte unsigned);

загрузка байта с расширением знака

(lb, от англ. load byte) ;

сохранение байта (sb, от англ. store byte).

Загрузки байтов из памяти в регистры

Инструкция загрузки байта без знака (lbu)

загружает байт из памяти в младший байт 32-битного регистра, обнуляя при этом остальную его часть.

Эта операция называется дополнением нулями (англ.: zero extension).

Инструкция загрузки байта с расширением знака (lb) загружает байт из памяти в младший байт 32-битного регистра, а оставшиеся биты регистра заполняет знаковым битом байта, т.е. битом 1.

Эта операция называется

расширением знака

(англ.: sign extension).

Инструкция сохранения байта (sb) Инструкция sb сохраняет любое значение в младший байт $s3 по адресу 3 и заменяет значение 0xF7 ,например, новым значением 0х9В.

Старшие байты $s3 игнорируются.