Savereg: PushReg <bx, ex, di, si, es, Cur_win> ; сохранение в стеке
mov bx, fs ; копируем код сегмента из fs в bx
mov es, bx ; копируем код сегмента из bx в es
mov fs, Vbuff ; fs = сегмент видеобуфера
ЮЗак П78
xchg di, si перестановка адресов di и si
call calloffs вычисление константы offsline
svrg: push ex сохранение значения счетчика строк
mov ex, dx задание количества точек в строке
call saveline копируем очередную строку
add si, bx адрес начала следующей строки
jnc @F -> адрес в пределах окна
call Nxtwin установка следующего окна
@@: pop ex восстановление счетчика строк
loop svrg управление повторами цикла
push es помещаем код сегмента из es в стек
pop fs и выталкиваем его из стека в fs
PopReg <Cur_win, es, si, di, ex, bx> ; восстановление из стека
call setwin восстановление исходного окна
ret возврат из подпрограммы
Напомним, что команда xchg не работает с сегментными регистрами, а у команды mov только один операнд может быть именем сегментного регистра. Поэтому для пересылки содержимого одного сегментного регистра в другой приходится использовать либо регистр-посредник, либо стек. Оба этих способа показаны в примере 7.15.
Основной цикл пересылки примера 7.15 имеет имя svrg, он отличается от аналогичного цикла примера 7.14 (mvsr) только одной командой. При вычислении адреса следующей строки константа коррекции прибавляется к содержимому регистра si, а не di, как это делалось в примере 7.14.