Конспект лекций Системное программирование (семестр 2) Возле названия каждой лекции написано число пар, в течение которых она будет читаться (+ ср обозначает - страница 8

AND
(logical AND)

Логическое И

 

^ Схема команды: 

and приемник,источник 

Назначение: операция логического умножения для операндов приемник и источник размерностью байт, слово или двойное слово.

Синтаксис

Алгоритм работы:

^ Состояние флагов после выполнения команды:

11

07

06

02

00

OF

SF

ZF

PF

CF

0

r



r

0

Применение:

Команда and используется для логического умножения двух операндов. Результат операции помещается по адресу первого операнда. Эту команду удобно использовать для принудительной установки или сброса определенных битов операнда.

Например, преобразуем двузначное упакованное BCD-число в его символьный эквивалент.

u_BCD   db      25h ;упакованное BCD-число

s_ch    dw      0 ;место для результата

...

        xor     ax,ax   ;очистка ax

        mov     al,u_BCD

        shl     ax,4    ;ax=0250

        mov     al,u_BCD        ;ax=0225

;преобразование в символьное представление:

        and     ax,3f3fh        ;ax=3235h

        mov     s_ch,ax

        

^ См. также: уроки 9, 12 и команды or, xor, test
BOUND
(check array BOUNDs)

Контроль нахождения индекса массива в границах

 

^ Схема команды: 

bound индекс,границы массива 

Назначение: проверка нахождения значения индекса в границах массива.

Синтаксис

Алгоритм работы:

Cравнить значение в регистре индекс с двумя значениями, расположенными последовательно в ячейке памяти, адресуемой операндом границы массива. Диапазон значений индекса определяется используемым регистром индекс:

Если в результате проверки значение из регистра вышло за пределы указанного диапазона значений, то возбуждается прерывание с номером 5, если нет, программа продолжает выполнение.

^ Состояние флагов после выполнения команды:

выполнение команды не влияет на флаги

 

Применение:

Команду bound очень удобно использовать для контроля выхода за нижнюю или верхнюю границы массива. Значения этих границ должны быть предварительно помещены в два последовательных слова (двойных слова) в памяти. Адрес этих слов (двойных слов) указывается вторым операндом. Далее динамически в ходе работы программы значение в регистре индекс, указываемом первым операндом, сравнивается со значениями этих двух границ, и если нижняя_граница<=(индексindex)<=верхняя_граница, то программа продолжает выполнение. В противном случае генерируется исключительная ситуация 5 (int 5). Далее в программе обработки этой ситуации можно выполнить необходимую корректировку и вернуться в программу (см. урок 17).

Фрагмент, который можно использовать при обработке одномерного массива с размерностью элементов в слово:

.286    ;это обязательная директива, так как bound

        ;входит в систему команд микропроцессоров, начиная с i286

.data

BoundMas        label   word

Low_Bound       dw      0

Upp_Bound       dw      20

mas     dw      10 dup (?)

...

        xor     di,di   ;очистка индексного регистра

cycl:

        mov     ax,mas[di]      ;перебор

элементов массива

        add     di,2

        bound   di,BoundMas

;если значение в di не будет попадать в границы, то будет вызван

;обработчик прерывания 5, где можно скорректировать

;значение ip/eip в стеке с тем, чтобы выйти

;из бесконечного ;цикла, например, на метку М2 или

;выполнить другие действия

        jmp     cycl

М2:

...

        

^ См. также: урок 17 и команду iret/iretd

5456521854842273.html
5456621768921644.html
5456651188817185.html
5456856648577163.html
5456896256818028.html