4. Логические операции, переходы, ветвления и циклы

Занятие 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
}

Задание #

  1. Доработайте программу вычисления расстояния так чтобы она могла работать циклически (выдавая каждый раз вопрос, нужно ли продолжать)