Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

epd629

.pdf
Скачиваний:
17
Добавлен:
02.05.2015
Размер:
1.05 Mб
Скачать

3.СДВИГИ И ЦИКЛИЧЕСКИЕ СДВИГИ

3.1.Перечень сдвиговых операций

Впроцессорах 8086 имеется возможность сдвигать биты регистра или переменной в памяти влево или вправо.

Возможны следующие операции:

логический сдвиг влево или вправо;

арифметический сдвиг влево или вправо;

циклический сдвиг влево или вправо;

циклический сдвиг через флаг переноса влево или вправо.

3.2.Логический сдвиг

Инструкция shl (сдвиг влево, синоним sal) перемещает каждый бит операнда-приемника на один разряд влево, по направлению к самому значащему биту. Значение 10010110b (96h или 150 в десятичном представлении без знака), записанное в al, сдвигается влево с помощью инструкции shl al,1. В результате получается значение 00101100b (2Ch), которое записывается обратно в регистр al. Флаг переноса устанавливается в значение 1.

Самый значащий (старший) бит сдвигается из операнда и попадает во флаг переноса, а в наименее значащий бит заносится 0.

Сдвиг влево чаще всего используется для выполнения с помощью операции shl умножения на степень числа 2. Например, с помощью следующих инструкций dx умножается на 8:

shl dx,1 ; dx := dx * 2 shl dx,1 ; dx := dx * 2 shl dx,1 ; dx := dx * 2

Умножение с помощью сдвига выполняется гораздо быстрее, чем с помощью операции mul.

В предыдущем примере в инструкции shl используется второй операнд значение 1 указывает, что содержимое dx нужно сдвинуть на 1 бит. Процессор 8086 не поддерживает использования в качестве константы сдвига других, отличных от единицы, постоянных значений: 2, 3 и т.д. Однако в качестве счетчика сдвигов допускается использование регистра cl.

Например:

 

mov cl,3

 

shl dx,cl

;dx := dx *8

умножают содержимое регистра dxна 8 (как и в предыдущем примере).

21

Инструкция shr (сдвиг вправо) выполняет сдвиг разрядов операнда вправо на 1 или cl битов, затем сдвигает наименее значащий бит во флаг переноса и помещает 0 в самый значащий бит. Инструкция shr дает быстрый способ выполнения беззнакового деления на степень числа 2.

3.3. Арифметический сдвиг

Инструкция sar (арифметический сдвиг вправо) сдвигает наиболее значащий бит операнда вправо в следующий бит, а затем копирует обратно. Значение 10010110b (96h или -106 в десятичном представлении со знаком), записанное в регистре al, сдвигается вправо с помощью инструкции sar al,1. В результате получается значение 11001011b (0cbh или -53 в десятичном представлении со знаком), которое записывается обратно в регистр al.

Флаг переноса устанавливается в значение 0.

Таким образом, при выполнении данной инструкции сохраняется знак операнда, поэтому инструкцию sar полезно использовать для выполнения деления со знаком на степень числа 2. Например, в результате выполнения инструкций:

mov bx,-4 sar bx,1

в регистре bx будет записано значение -2.

3.4. Циклический сдвиг

Инструкция циклического сдвига вправо ror наименее значащий бит сдвигает в наиболее значащий бит, а также во флаг переноса. Значение 10010110b, записанное в регистре al, циклически сдвигается вправо с помощью инструкции ror al,1. В результате получается значение 01001011b, которое записывается обратно в регистр al. Флаг переноса устанавливается в значение 0.

Операция циклического сдвига влево rol сдвигает наиболее значащий бит в наименее значащий.

22

3.5. Циклический сдвиг через флаг переноса

Инструкция циклического сдвига вправо через флаг переноса rcr сдвигает операнд вправо, при этом наиболее значащий бит сдвигается из флага переноса. Значение 10010110b (96h или 159 в десятичном представлении), записанное в регистре al, циклически сдвигается вправо через флаг переноса, начальное значение которого равно 1, с помощью инструкции rcr al,1. В результате получается значение 11001011b, которое записывается обратно в регистр al. Флаг переноса устанавливается в значение 0, т.к. наименее значащий бит равен нулю.

Инструкция циклического сдвига влево через флаг переноса rcl сдвигает операнд влево, при этом наименее значащий бит сдвигается из флага переноса. Инструкции rcr и rcl полезно использовать для сдвига операнда, состоящего из нескольких слов. Например, следующие инструкции выполняют умножение значения в dx:ax, размером в двойное слово, на 4:

shl

ax,1

; бит 15 регистра ax сдвигается во флаг переноса

rcl

dx,1

; флаг переноса сдвигается в бит 0 регистра dx

shl

ax,1

; бит 15 регистра ax сдвигается во флаг переноса

rcl

dx,1

; флаг переноса сдвигается в бит 0 регистра dx

Инструкции циклического сдвига, аналогично инструкциям сдвига, могут сдвигать операнд на 1 бит или на число битов, заданных регистром cl.

Контрольные вопросы

1.Можно ли применять инструкции (команды) сдвига по отношению к регистрам:

al, ah, bl, bh, cl, ch, dl,dh;

ax, bx, cx, dx, si, di, cs, ds, ss, es, sp, bp, ip, flags;

eax, ebx, ecx, edx, esi, edi, esp, ebp, eip, eflags?

2.Можно ли применять инструкции (команды) сдвига по

отношению к ячейкам памяти:

размером один байт (b1, b2, …)

размером одно слово (w1, w2, …)

размером одно двойное слово (d1, d2,…)?

3.Назовите виды сдвигов.

4.Каков результат выполнения программы:

mov ax, 1 shl ax,1 ror ax,1?

5. Перечислите все восемь инструкций сдвигов.

23

6. Каков результат выполнения программы: mov ax, 1

shr ax,1 rol ax,1?

7. Каков результат выполнения программы: mov ax, 32768

shl ax,1 ror ax,1?

8. Каков результат выполнения программы: mov ax, 32768

shr ax,1 rol ax,1?

9. Каков результат выполнения программы: mov ax, 32768

sal ax,1 ror ax,1?

10. Каков результат выполнения программы: mov ax, 32768

sar ax,1 rol ax,1?

11. Каков результат выполнения программы: mov ax, 32768

rcl ax,1 ror ax,1?

12. Каков результат выполнения программы: mov ax, 32768

rcr ax,1 rol ax,1?

13. Каков результат выполнения программы: mov ax, 32768

rcl ax,1 rcr ax,1?

14. Каков результат выполнения программы: mov ax, 32768

rcr ax,1 ror ax,1?

15. Каков результат выполнения программы: mov ax, 32768

mov dx,0 rcl ax,1 rcr dx,1?

24

4. ПРОГРАММИРОВАНИЕ ОБРАБОТКИ ДИСКОВЫХ ФАЙЛОВ

4.1. Общие сведенья о работе с файлами

Обработка дисковых файлов в базовой DOS включает определение блока управления файлом (FCB file control block), который описывает файл и его записи. Передача адреса блока FCB в DOS обязательна для всех дисковых операций ввода-вывода.

Запись файла на диск требует, чтобы прежде он был "создан" и DOS сгенерировала соответствующий элемент в оглавлении. Когда все записи файла будут записаны, программа должна "закрыть" файл, чтобы DOS завершила обработку оглавления. Чтение файла требует, чтобы он был сначала "открыт" для того, чтобы убедиться в его существовании. Так как записи имеют фиксированную длину, обработка записей дискового файла может осуществляться как последовательно, так и произвольно.

Метод доступа к дисковой памяти, поддерживающий использование оглавления, "блокирование" и "разблокирование" записей, обеспечивается прерыванием DOS 21h. Более низкий уровень, обеспечивающий абсолютную адресацию дисковых секторов также через DOS, выполняется посредством прерываний 25h и 26h. Самый низкий уровень обеспечивается прерыванием BIOS 13h, которое позволяет выполнить произвольную адресацию в дисковой памяти по номеру дорожки и сектора. Методами DOS осуществляют некоторую предварительную обработку до передачи управления в BIOS.

Термин “кластер” определяет один или более секторов с данными в зависимости от дискового устройства.

Примеры работы с файлами и использования операций создания, открытия, записи или чтения и закрытия приведены на рис. 4.1

4.2. Блок управления файлом (FCB)

Для выполнения ввода-вывода на диск в базовой DOS необходимо определить блок FCB. Блок FCB не поддерживает путь доступа к файлу, поэтому он используется для обработки файлов в текущей директории. Блок FCB содержит (рис. 4.2) описание файла и его

25

записей. Пользователь должен инициализировать байты 0 15 и 32 36, DOS устанавливает байты 16 31.

Создать

файл

Записать в файл

Закрыть

файл

а)

Открыть

файл

Записать в файл

Записать в файл

Записать в файл

Закрыть

файл

г)

Открыть

файл

Записать в файл

Закрыть

файл

б)

Открыть

файл

Чтение из файла

Вычисления

Записать в файл

Закрыть

файл

26д)

Открыть

файл

Чтение из файла

Закрыть

файл

в)

Открыть файл 1

Открыть файл 2

Чтение из файла 1

Вычисления

Записать в файл 2

Закрыть

файлы

е)

Рис.4.1 Примеры работы с файлами и использования операций создания,

Помните, что открытиячисловые, записизначенияили чтенияв словахи закрытияи двойных словах записываются в обратной последовательности байтов.

 

 

 

 

Таблица 4.2

 

 

 

 

 

 

Байты

 

 

 

Назначение

 

0

Указывает дисковод: 01 для дисковода A, 02 для B и т.д.

 

1-8

Имя файла, выровненное по левой границе с конечными пробелами, если

 

имя меньше 8 байтов. Поле может содержать зарезервированные имена,

 

например LPT1 для принтера

 

 

9-11

Тип файла для дополнительной идентификации, например dat или asm. Если

 

тип файла меньше трех байтов, то он должен быть выровнен по левой

 

границе и дополнен конечными пробелами. DOS хранит имя и тип файла в

 

оглавлении

 

 

 

 

12-13

Номер текущего блока. Блок содержит 128 записей. Для

локализации

 

конкретной записи используются номер текущего блока и номер текущей

 

записи (байт 32). Первый блок файла имеет номер 0, второй 1 и т.д.

 

Операция открытия файла устанавливает в данном поле 0

 

14-15

Логический размер записи. Операция открытия инициализирует размер

 

записи значением 128 (т.е. 80h). После открытия и перед любой операцией

 

чтения или записи можно устанавливать в данном поле любое требуемое

 

значение длины записи

 

 

 

16-19

Размер файла. При создании файла DOS вычисляет и записывает это

 

значение (произведение числа записей на размер записей) в оглавление.

 

Операция открытия выбирает размер файла из оглавления и заносит его в

 

данное поле. Программа может читать это поле, но не может менять его

20-21

Дата. При создании или последней модификации файла DOS записывает

 

дату в оглавление. Операция открытия выбирает дату из оглавления и

 

заносит в данное поле

 

 

 

22-31

Зарезервировано для DOS

 

 

 

32

Текущий номер записи. Данное поле содержит текущий номер записи (0-

 

127) в текущем блоке (см. байты 12 13). Система использует текущие

 

значения блока и записи для локализации записи в дисковом файле. Обычно

 

номер начальной записи в данном поле 0, но его можно заменить для

 

начала последовательной обработки на любое значение от 0 до 127

33-36

Относительный номер записи. Для произвольного доступа при операциях

 

чтения или записи данное поле должно содержать относительный номер

 

записи. Например, для произвольного чтения записи номер 25 (т.е. 19h),

 

необходимо установить в данном поле 19000000h. Произвольный доступ

 

характеризуется

тем,

что

система автоматически

преобразует

 

относительный номер записи в текущие значения блока и записи. Ввиду

 

ограничения на максимальный размер файла (1 073 741 824 байта), файл с

 

короткими записями может содержать больше записей и иметь больший

 

относительный номер записи. Если размер записи больше 64, то байт 36

 

всегда содержит 00

 

 

 

 

27

4.3. Использование блока FCB для создания файла на диске

Для ссылки на каждый дисковый файл программа должна содержать правильно составленный блок управления файлом (в той части COM-программы, где описываются данные, или в сегменте данных EXE-программы). Операции ввода-вывода на диск требуют установки адреса блока FCB в регистре dx. Доступ к полям блока FCB осуществляется по этому адресу с помощью регистровой пары ds:dx. Для создания нового файла программа использует функцию 16h в прерывании DOS int 21h следующим образом:

mov ah,16h

; создание

lea dx,FCBname

; дискового файла

int 21h

; вызов DOS

DOS осуществляет поиск имени и типа файла, взятого из соответствующих полей FCB в оглавлении. Если элемент оглавления, содержащий необходимое имя (и тип), будет найден, то DOS очищает найденный элемент для нового использования; если такой элемент не найден, то DOS ищет свободный элемент. Затем операция устанавливает размер файла в 0 и "открывает" файл. На этапе открытия происходит проверка доступного дискового пространства, результат такой проверки устанавливается в регистре al (табл. 4.3).

 

Таблица 4.3

al

Результат проверки

00

На диске есть свободное пространство

FF

На диске нет свободного пространства

При открытии в блок FCB также устанавливаются номер текущего блока 0 и размер записей (по умолчанию) 128 байтов. Прежде чем начать запись файла, можно заменить это значение на требуемый размер записей.

В DTA не требуется устанавливать ограничитель конца записи, т.к. блок FCB содержит размер записей. Для указания на начало выводимой на диск информации необходимо с помощью функции 1ah сообщить DOS адрес DTA, т.е. области передачи данных (DTA disk trausfer area). В любой момент времени может быть активна только одна область DTA. В следующем примере инициализируется адрес DTA:

mov ah,1ah

; установка адреса

lea dx,DTAname

; DTA

int 21h

; вызов DOS

 

28

Если программа обрабатывает только один дисковый файл, то должна быть только одна установка адреса DTA для всего выполнения. При обработке нескольких файлов программа должна устанавливать соответствующий адрес DTA непосредственно перед каждой операцией чтения или записи. Для последовательной записи на диск существует функция 15h:

mov ah,15h

; последовательная

lea dx,FCBname

; запись

int 21h

; вызов DOS

Операция записи использует информацию из блока FCB и адрес текущего буфера DTA. Если длина записи равна размеру сектора, то запись заносится на диск. В противном случае записи заполняют буфер по длине сектора и затем буфер записывается на диск. Например, если длина каждой записи составляет 128 байтов, то буфер заполняется четырьмя записями (4*128=512) и затем буфер записывается в дисковый сектор. После успешного занесения записи на диск DOS увеличивает в блоке FCB размер файла на размер записи и текущий номер записи на 1. Когда номер текущей записи достигает 128, про исходит сброс этого значения в 0 и в FCB увеличивается номер текущего блока на 1. Операция возвращает в регистре al следующие коды:

 

Таблица 4.4

 

 

al

Результат проверки

00

Успешная запись

01

Диск полный

02

В области DTA нет места для одной записи

Когда запись файла завершена, можно, хотя и не всегда обязательно, записать маркер конца файла (1Ah). Для закрытия файла используется функция 10h:

mov ah,10h

; закрыть

lea dx,FCBname

; файл

int 21h

; вызов DOS

Эта операция записывает на диск данные, которые ещё остались в дисковом буфере DOS, и изменяет в соответствующем элементе оглавления дату и размер файла. В регистре al возвращаются следующие значения:

Таблица 4.5

al

Результат проверки

00

Успешная запись

FFОписание файла оказалось в неправильном элементе оглавления (возможно, в результате смены дискеты)

29

4.4.Последовательное чтение дискового файла

Вбазовой версии DOS программа, читающая дисковый файл, содержит блок управления файлом, который определяет файл точно так, как при его создании. В начале программа для открытия файла использует функцию 0f:

mov ah,0fh

; открытие

lea dx,FCBname

; файла

int 21h

; вызов DOS

Операция открытия начинается с поиска в оглавлении элемента с именем и типом файла, определенными в FCB. Если такой элемент не будет найден в оглавлении, то в регистре al устанавливается FFh. Если элемент найден, то в регистре al устанавливается 00 и в FCB заносится действительный размер файла, а также устанавливаются номер текущего блока в 0, длина записи в 80h. После открытия можно заменить длину записи на другое значение.

DTA должно содержать определение считываемой записи в соответствии с форматом, который использовался при создании файла. Для установки адреса DTA используется функция 1ah (не путать с маркером конца файла EOF 1ah) аналогично созданию дискового файла:

mov ah,1ah

; установка

lea dx,DTAname

; адреса DTA

int 21h

; вызов DOS

Для последовательного чтения записей с диска используется функция

14h:

mov ah,14h

; последовательное

lea dx,FCBname

; чтение записей

int 21h

; вызов DOS

Чтение записи с диска по адресу DTA осуществляется на основе информации в блоке FCB. Операция чтения устанавливает в регистре al следующие коды возврата:

 

Таблица 4.6

al

Результат проверки

00

Успешное чтение

01

Конец файла, данные не прочитаны

02

В DTA нет места для чтения одной записи

03

Конец файла, прочитана частичная запись, заполненная нулями

Первая операция чтения заносит содержимое всего сектора в буфер DOS. Затем операция определяет из блока FCB размер записи и

30

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]