Материал: 1328

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам

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

Источник: https://studfile.net/preview/16407385/