1 курс 1 семестр / лекции / Лекция 4 Условные опреат массив
.pdfЛекция 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 раз.