Базовый CS с нуля
Control flow: тест с множественным выбором
Шесть вопросов, проходящих через весь unit. Ни один не просит определение. Каждый просит рассуждать о том, что program counter сделает дальше — а это и есть единственный вопрос, к которому сводятся любой branch и любой loop.
Убедитесь, что вы связываете четыре урока в одну модель: program counter управляет flow, инструкция сравнения выставляет флаги, conditional jump читает один бит флага, backward jump повторяет тело, а if/else — это просто два адреса назначения для PC.
Две работающие машины хранят одинаковые байты инструкций по одинаковым адресам, но исполняют совершенно разные последовательности инструкций. Как такое возможно?
Выполнился CMP R0, R1, затем достигнут JNE (jump if not equal). Какую единственную часть состояния JNE реально проверяет, решая jump или fall-through?
if/else компилируется в: CMP; conditional jump на ELSE; блок if-true; безусловный JUMP на END; ELSE: блок if-false; END. Зачем нужен безусловный JUMP после блока if-true?
На машинном уровне в чём единственное структурное различие между скомпилированным while loop и for loop?
Loop обратного отсчёта уменьшает счётчик и должен выйти при достижении 0, но никогда не выходит и держит CPU на 100%. Какое объяснение согласуется с тем, как машина реально исполняет loop?
В sumPositives по [3, -1, 4] внутренний if пропускает отрицательный элемент. Когда nums[i] не положителен, что делает машина и завершается ли loop досрочно?
Весь unit — одна сквозная линия: program counter решает, что выполнится дальше, и только jump может его изменить. Сравнение выставляет флаг; conditional jump читает этот один флаг и либо прыгает, либо делает fall-through; if/else — это два адреса назначения для PC с защитным JUMP на границе; loop — это backward jump, чей conditional-тест наверху решает, упасть ли снова в тело; а loop работает вечно, когда проверяемое значение никогда не меняется. Любые branch и loop, которые вы прочтёте, сводятся к одному вопросу: куда PC указывает дальше и почему.