1 курс 2 семестр / лекции / Лекция 4 Условные опреат массив — копия
.pdf3. Массивы.
Массивы удобно использовать для доступа к большому количеству однородных или сходных данных. Массив располагается в ячейках памяти со строго последовательными адресами и занимает непрерывный участок памяти. Каждый массив состоит из последовательности элементов одинакового размера, и
каждый элемент массива имеет порядковый номер, называемый индексом.
Показан массив (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 игнорируются.