Reklama

Оператор DO

Из-за всего этого мне захотелось иметь более простую версию цикла FOR. Причина появления всего этого кода выше состоит в необходимости иметь счетчик цикла, доступный как переменная внутри цикла. Если все, что нам нужно это считающий цикл, позволяющий нам выполнить что-то определенное число раз, но не нужен непосредственный доступ к счетчику, имеется более простое решение. Процессор 68000 имеет встроенную команду «уменьшить и переход если не ноль», которая является идеальной для подсчета.

Для полноты давайте добавим и эту конструкцию. Это будет наш последний цикл.
Синтаксис и его перевод:
DO
<expr> Emit(SUBQ #1,D0);
L = NewLabel;
PostLabel(L);
Emit(MOVE D0,-(SP)
<block>
ENDDO Emit(MOVE (SP)+,D0;
Emit(DBRA D0,L)
Это гораздо проще! Цикл будет выполняться <expr> раз. Вот код:

Parse and Translate a DO Statement
procedure Dodo;
var L: string;
begin
Match(‘d’);
L := NewLabel;
Expression;
EmitLn(‘SUBQ #1,D0′);
PostLabel(L);
EmitLn(‘MOVE D0,-(SP)’);
Block;
EmitLn(‘MOVE (SP)+,D0′);
EmitLn(‘DBRA D0,’ + L);
end;

Я думаю вы согласитесь, что это гораздо проще, чем классический цикл FOR. Однако, каждая конструкция имеет свое назначение.

Reklama