Найти тему

Бесконечный цикл в Ассемблере

Любой цикл в любом языке программирования можно сделать бесконечным. В некоторых случаях для этого придётся постараться, но в большинстве случаев стараться не надо. Простая невнимательность обычно приводит к тому, что программа зацикливается. Вот вам несколько способов сделать цикл бесконечным в Ассемблере.

Способ 1: инициализация счётчика после метки

Здесь мы немножко ошиблись, и сделали так, что новое значение в счётчик записывается ПОСЛЕ метки, к которой нас возвращает команда LOOP. Поэтому счётчик никогда не обнулится, и программа никогда не закончится.

Способ 2: возврат не на ту метку

-2

Суть ошибки здесь такая же, только причины разные. В первом случае мы не в том месте инициализировали счётчик, а во втором - просто перепутали имена меток, хотели переходить на mycycle, а написали start.

Способ 3: счётчик перед циклом равен 0

-3

Здесь вроде ничего плохого мы не сделали. Поскольку цикл по любому будет выполнен хотя бы один раз, то программист решил инициализировать счётчик нулём. И это была его ошибка. Хотя в языках высокого уровня это бы прокатило. А вот в ассемблере - не прокатит, потому что команда LOOP уменьшает счётчик.

Если в 16-разрядном регистре от 0 отнять 1, то получим 65535. Про 32 и 64 разрядные регистры уж молчу. То есть в таком случае цикл вместо 1 раза будет выполнен 65536 раз. Конечно, это не бесконечность. Но если в теле цикла выполняются какие-то ресурсоёмкие операции, то для пользователя это будет бесконечностью.

Поэтому, особенно в тех случаях, когда значение, записываемое в счётчик, вычисляется где-то в программе, надо перед циклом всегда проверять его на равенство нулю. Например, так:

-4

На этом всё. Подписывайтесь на канал, чтобы ничего не пропустить.