Предыдущий раздел ПЕРЕПИСКА СЕКТОРА ПАМЯТИ Следующий раздел

13.2. Копирование сектора

Как видно из рис.44, все процедуры, выполняющие функции по переписке сектора, пользуются услугами процедуры Copy_sector, которая записывает содержимое заданного сектора памяти в качестве содержимого другого заданного сектора. Copy_sector имеет два входных параметра: регистр SI содержит адрес (внутрисегментное смещение) сектора-источника, DI – адрес-смещение сектора-приемника.

При написании процедуры Copy_sector мы могли бы ограничиться уже известными нам операторами, но мы привлечем для этого ряд новых операторов:

 

;                       Копирует  сектор (256 байт)

;                       ------------------------------------------

;      Входы:   SI  – начальный адрес сектора-источника

;                    DI – начальный адрес сектора-приемника

;

Copy_sector:

push  cx

pushf                            ; Сохранить флаг направления  DF

cld                               ; Сбросить этот флаг

mov   cx, 256                ; В счетчике число байт

rep    movsb                  ; Пересылка цепочки байт

popf                              ; Восстановить флаг  DF

pop   cx

ret

 

Строковый (цепочечный) оператор movsb занимает центральное место в Copy_sector. Взятый без префикса rep, он выполняет:

1) пересылку байта из ячейки памяти с адресом в регистре SI в ячейку памяти, адрес которой находится в регистре DI;

2) изменяет на единицу адреса в регистрах SI и DI.

Направление изменения (увеличение или уменьшение) адресов в SI и DI определяется значением флага направления DF в регистре FLAGS. Если DF=0, то адреса увеличиваются, а если DF=1, то уменьшаются. Сброс флага DF выполняет специальный оператор cld, а установку – оператор std. Так как флаг направления может использоваться и в процедуре, вызывающей нашу процедуру, то целесообразно сохранить его перед изменением в стеке, а затем восстановить его оттуда. Для этого используются операторы pushf и popf, выполняющие запись в стек и извлечение оттуда регистра флагов.

Префикс повторения команды rep многократно усиливает мощность строковой команды. При этом оператор movsb выполняется столько раз, каково содержимое регистра CX. При каждом выполнении содержимое CX уменьшается на единицу. Как только это содержимое станет равным нулю, то выполняется следующий за movsb оператор.

Перед вызовом процедуры Copy_sector необходимо в вызывающей ее программе загрузить в регистры SI и DI начальные адреса секторов памяти. Для этого можно использовать оператор mov. Например, в результате оператора “mov si,Sector”  адрес самого первого байта области Sector будет помещен в регистр SI.

З а п и ш и т е  процедуру Copy_sector в файл Disp_sec.asm.

 


Предыдущий раздел В начало Следующий раздел