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