Занятие 4. Логические операции и переходы (метки). Ветвления и циклы #
Все предыдущие примеры имели линейную структуру, т.е. всегда выполнялась одна и та же последовательность команд, однако, в большинстве реальных программ используются циклы и ветвления.
Для организации структур управления в CIL используются два набора команд: команды сравнения
Операция | Описание |
---|---|
ceq | сравнение на равенство |
cgt | сравнение на больше |
clt | сравнение на меньше |
и команды переходов:
Операция | Описание |
---|---|
br | безусловный переход (выполняется всегда, независимо от состояния стека) |
brfalse | переход, если «ложь» (если в стеке 0 или false) |
brtrue | переход, если «истина» (если в стеке не 0 или true) |
Кроме того, активно используются совмещенные команды, выполняющие как сравнение, так и переход при выполнении условия:
Операция | Описание |
---|---|
beq | переход, если операнды равны |
bge | переход, если первый операнд больше или равен второму |
bgt | переход, если первый операнд строго больше |
ble | переход, если первый операнд меньше или равен второму |
blt | переход, если первый операнд строго меньше |
Далее приводится программа, которая запрашивает в цикле целые числа и для каждого выводит является ли число четным или нечетным (условием выхода из цикла является ввод пустой строки):
.assembly Step_4 {}
.method void main()
{
.entrypoint
.locals (string str)
input_loop:
ldstr "Введите целое число (для завершения работы - пустую строку)"
call void [mscorlib]System.Console::WriteLine(string)
call string [mscorlib]System.Console::ReadLine()
stloc str
ldloc str
call bool [mscorlib]System.String::IsNullOrEmpty(string)
brtrue exit
ldloc str
call int32 [mscorlib]System.Int32::Parse(string)
ldc.i4 2
rem
ldc.i4 0
ceq
brfalse odd
ldstr "Число - четное\n"
br print
odd:
ldstr "Число - нечетное\n"
print:
call void [mscorlib]System.Console::WriteLine(string)
br input_loop
exit:
ret
}
Задание #
- Доработайте программу вычисления расстояния так чтобы она могла работать циклически (выдавая каждый раз вопрос, нужно ли продолжать)