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

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

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

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

Вопросы:

1.Условные операторы

2.Циклы.

3.Массивы.

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

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

1.1.Оператор if

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

Код на языке высокого уровня: if (i==j)

f=g+h;

блок если

f=f-I;

 

r=m;

 

На ассемблера MIPS существуют 2 операторы условного перехода : bne- branch if not equal - переход, если не равно;

beq - branch if equal - переход, если равно.

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

$s0=f, $s1=g, $s3=h, $s4=j #

bne $s3, $s4,L1;

#

add $s0,$s1,$s2;

#

L1:

 

sub $s0,$s0,$s3;

#

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

branch if not equal i != j - переход при неравенстве регистров на метку L1

оператор add – не выполняется

следующий выполняемый оператор sub

Инструкция bne осуществляет ветвление, пропуская оператор add, когда i != j. Если i == j, то ветвление не осуществляется и идет последовательное выполнение операторов: add и sub

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

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

Код на языке высокого уровня: if (i==j)

f=g+h;

блок если сложение переменных

else (i!=j)

блок иначе вычитание перменных

f=f-I;

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

$s0=f, $s1=g, $s3=h, $s4=j

#

bne $s3, $s4,else;

#

add $s0,$s1,$s2;

#

j L2;

 

else:

 

L2: sub $s0,$s0,$s3;

#

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

Проверка условия неравенства регистров выполнение

блока else

Выполнение блока если (оператор сложения) и переход на метку L2 , а затем мимо метки else

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

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

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

Если ни одно из условий не удовлетворяется, то выполняется блок (default) недостаточно для выполнения всех условий.

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

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

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

switch (amount)

 

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

{

 

 

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

case 20: fee=2;

break;

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

case 50:

fee=3;

break;

если число 50, то fee=3; иначе

если число 100, то fee=5; иначе

case 100: fee=5;

break;

default - не выполнены условия: fee=0

default:

fee=0

 

}

 

 

 

//или с помощью использования операторов if/else

if (amount = =20)

fee=2;

 

else if

(amount = =50)

fee=3;

else if

(amount = =100)

fee=5;

else

 

 

 

fee=0;

 

 

 

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

Синие стрелы – не выполнение условий и последовательный переход к default . Красные стрелы – выполнение любого условия и после него переход к done.

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, переход к done

add $s1, $s1, $s0

# sum = sum + i

addi $s0, $s0, 1

# увеличение i

J for

 

done

 

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

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