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

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

.pdf
Скачиваний:
19
Добавлен:
27.12.2022
Размер:
1.02 Mб
Скачать

Лекция 5. Программирование.MIPS.

Вопросы:

1.Условные операторы, циклы.

2.Массивы.

1. Условные операторы, циклы.

Операторы if, if/else и switch/case являются условными операторами. Каждый из этих операторов при выполнении определённого условия исполняет участок кода, состоящий, в свою очередь, из одного или нескольких операторов.

1.1.Оператор if

Оператор if выполняет участок кода, называемый блоком если (англ.: if block), только если выполнено заданное условие.

Присвоение переменных регистрам

branch if not equal i != j

Если не равно переход к метке L1. Поэтому блок если равно не выполняется

Инструкция bne осуществляет ветвление, пропуская блок если, когда i != j. Если i == j, то ветвление не осуществляется и блок если, как и ожидалось, выполняется. «ЕСЛИ» - выполняется,

как обратное событие команде «bne».

Операторы if/else

Операторы if/else выполняют один из двух участков кода в зависимости от условия. Когда выполнено условие выражения if, выполняется блок если. В противном случае выполняется блок иначе

Ассемблерный код проверяет противоположное условие -(i != j) неравенство. Если противоположное условие истинно, то инструкция bne пропускает блок если и выполняет блок иначе. В противном случае, блок если выполняется и завершается инструкцией перехода (j) для перехода на участок после блока если

Операторы switch/case

Операторы switch/case выполняют один из нескольких участков кода в зависимости от того, какое из данных условий удовлетворяется. Если ни одно из условий не удовлетворяется, то выполняется блок default (недостаточно).

ОПЕРАТОРЫ switch/case

Код на языке высокого уровня

switch (amount)

 

 

{

 

 

 

case 20:

fee=2;

break;

 

case 50:

fee=3;

break;

 

case 100: fee=5;

break;

 

default:

fee=0

 

}

 

 

 

//equivalent function using

if/else

if (amount = =20) fee=2;

 

else if

(amount = =50)

fee=3;

else if

(amount = =100)

fee=5;

else

 

 

 

fee=0;

 

 

 

(переключение в случае)

Оператор case внутри фигурных скобок.

Его действие:

Если число 20 ,то fee (гонорар)=2 иначе

Если число 50, то fee=3; иначе Если число 100, то fee=5; иначе default: fee=0

statements

Регистр s0 – число , регистр s1 =fee

1.2. Операторы цикла.

Циклы многократно выполняют участок кода в зависимости от условия.

Циклы for и циклы while являются обычными конструкциями для организации циклов в языках высокого уровня

Циклы while.

Циклы while многократно выполняют участок кода до тех пор, пока условие не станет ложным. В примере кода цикл while ищет значение x такое, что 2x = 128.

Цикл выполнится семь раз, прежде чем достигнет условия pow = 128.

Счет 2х - $s0 Увеличение х на1 - $s1

В ассемблерном коде в цикле while проверяется условие, противоположное условию, использованному на языке высокого уровня, аналогично тому, как это делается для оператора if/else. Если это противоположное условие истинно, то цикл while завершается.

В примере кода оператор цикла while сравнивает значение переменной pow со значением 128 и завершает цикл, если они равны.

В противном случае происходит удвоение pow (используя сдвиг влево - команда sll), увеличение x на 1 и переход обратно на начало цикла while.

Циклы for

Циклы for, как и циклы while, многократно выполняют участок кода до тех пор, пока условие цикла не станет ложным.

Однако циклы for добавляют поддержку счетчика цикла, который обычно хранит количество выполненных итераций цикла.

Цикл for выглядит следующим образом:

for (инициализация; условие; операция цикла)

Код инициализации выполняется до того, как цикл for начнется.

Условие проверяется в начале каждой итерации. Если условие не выполнено, цикл завершается.

Операция цикла выполняется в конце каждой итерации.

Пример кода складывает целые числа от 0 до 9.

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

# $s0 = i, $s1 = sum $s0значение i; $s1 – значение суммы

add $s1, $0, $0 # sum = 0

в $s1 установим начальное значение суммы 0

addi $s0, $0, 0 # i = 0

в $s0 установим начальное значение I =0

addi $t0, $0, 10 # $t0 = 10

в $t0 установим конечное значение суммы 10

for:

 

beq $s0, $t0, done

# if i = = 10, branch to done

add $s1, $s1, $s0

# sum = sum + i

addi $s0, $s0, 1

# increment i

J for

 

done

 

Счетчик итераций цикла, в данном случае i, инициализируется нулем и увеличивается на единицу в конце каждой итерации. Условие неравентва i != 10 проверяется в

начале каждой итерации. Итерация цикла for выполняется только тогда, когда условие истинно, т.е. когда значение i не равно 10, иначе цикл завершается. В нашем случае цикл for выполняется 10 раз.