Savinfo: PushReg <Cur_win,ax,ex,si,di,fs,es>; сохранение в стеке
call setwin установка исходного окна
mov fs, Vbuff fs = сегмент видеобуфера
mov si, Inflino si = адрес начала информ. строки
mov es, GenSeg es = сегмент общего назначения
xor di, di di = 0 — смещение в GenSeg
mov ax, horsize ax = ширина экрана
mul byte ptr hsymb умножаем ее на высоту символа
mov ex, ax копируем результат в сх
shr сх, 02 уменьшаем его в 4 раза
Savlp: movs dword ptr [di] fs:[si]; копирование двойного слова
or si, si адрес в пределах видеосегмента ?
jnc @F -> да, переход на команду loop
call nxtwin установка следующего окна
@@: loop savlp » управление циклом копирования
PopReg <es,fs,di,si,cx,ax,Cur_win>; восстановление из стека
call setwin ; восстановление исходного окна
ret ; возврат из подпрограммы
В примере 5.21 копирование содержимого видеопамяти в оперативную выполняет строковая операция movs, у которой приемник находится в регистрах es:di, а источник в fs:si. Содержимое этих регистров формируется перед циклом пересылки. Затем вычисляется размер информационной области в байтах, и результат преобразуется в количество двойных слов. Строки рабочей области экрана копируются полностью, поэтому нужен только один цикл, в котором пересылается сразу по 4 байта. Цикл пересылки повторяет аналогичный цикл из примера 3.20 с той разницей, что копируются не байты, а двойные слова.
После пересылки восстанавливается содержимое сохраненных в стеке регистров и значение переменной cur_win, восстанавливается исходное окно видеопамяти и происходит возврат на вызывающий модуль.