drawline: | movs | byte ptr [di] , fs:[si] | ; | запись кода точки в видеобуфер |
or | di, di | ; | начало нового сегмента ? | |
jne | @F | ; | -> нет, обход команды call NxtWin | |
call | NxtWin | ; | установка следующего окна | |
@@: | loop | drawline | ; | управление повторами цикла |
ret | ; | возврат из подпрограммы |
Сравните второй вариант примера 3.6 и пример 3.15. Приведенные в них тексты различаются только первой командой. Вместо stosb, записывающей в видеопамять содержимое регистра ai, в данном случае используется строковая операция movs, копирующая в видеопамять байты оперативной памяти. Обратите внимание на то, что в записи строковой операции сегментный регистр приемника (es) указывать не обязательно, а сегментный регистр источника (fs) вы можете изменить по своему усмотрению.
Подпрограмма примера 3.15 выводит точки в порядке увеличения их адресов. В некоторых случаях может возникнуть необходимость выводить точки в обратном порядке (справа налево) в сторону уменьшения адресов. Как можно нарисовать линию в направлении справа налево, было показано во втором варианте примера 3.7. Если в этом примере команду lodsb заменить командой movs byte ptr [di], fs:[si], то подпрограмма будет строить строку рисунка в обратном направлении. Когда и зачем может понадобиться такая замена, мы обсудим при описании построения рисунков.