Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Организация ЭВМ и сетей - Лаба 01.rtf
Скачиваний:
5
Добавлен:
10.07.2019
Размер:
764.62 Кб
Скачать

Команды логических операций и сдвигов.

ЛОГИЧЕСКИЕ ОПЕРАЦИИ

AND dst, src ;dst := dst * src Логическое поразрядное умножение

Базовая индексная адресация. Адрес (SS) * 16 + (BP) + (DI). Содержимое этой ячейки поразрядно умножается на константу. Флаги OF, CF, SF, ZF = 0; PF = 1 (в результате четное число единиц).

AND [BP] [DI], 0F00h

(DI) = 3500

(BP) = 6000

(SS) = A800

(B1500) = 39AF

(B1500) = 900h

OR dst, src ;dst := dst + src Логическое поразрядное сложение

XOR dst, src ;dst := dst Å src Поразрядное исключающее ИЛИ

TEST dst, src ; dst + src Поразрядное логическое умножение без изменения операндов, меняются только флаги.

Всегда логические команды переводят флаги OF и CF в ноль, состояние флагов SF, ZF, PF зависит от полученного результата.

NOT src ; src := src Поразрядная инверсия. Флаги не меняет.

СДВИГИ.

Разделяются на циклические сдвиги, циклические сдвиги через перенос, логические и арифметические. Первый операнд команды задает регистр или ячейку памяти, второй - число сдвигов, которое может указываться в регистре CL или быть константой 1. Флаг CF всегда содержит значение последнего выдвинутого бита. Флаги SF, ZF, PF в сдвигах через перенос не определены, в остальных изменяются в соответствии с результатом.

;Циклический сдвиг через перенос содержимого регистра DL влево. Старший разряд записывается в CF, а старое значение CF заносится в младший разряд

(CF) =0

RCL DL, 1

(DL) = 3A = 0011 1010

(CF) = 1

(DL) = 0111 0101 =75h,

;Циклический сдвиг через перенос вправо ячейки с адресом (DS) * 16 + (SI) (индексная адресация) на 3 разряда (содержимое CL). Младший разряд записывается в CF, а предыдущее значение CF заносится в старший разряд.

RCR [SI], CL

(SI) = 1500

(DS) = EF00

(CL) = 3

(CF) = 1

(F0500) = 4C = 0100 1100 Þ 1010 0110 Þ 0101 0011 Þ0010 1001 = 29, (CF) = 1.

;Циклический сдвиг влево содержимого регистра BX После каждого сдвига старший разряд BX записывается в CF и в младший разряд BX.

ROL BX,CL

(BX) = ABCD

(CL) = 5

(BX) =

;Циклический сдвиг вправо ячейки с адресом (SS) * 16 + (BP) + 40 (базовая адресация). После каждого сдвига младший разряд записывается в CF и в старший разряд переменной.

ROR [BP + 40h], 1

(BP) = 2000

(SS) = 4F00

(51040) = 75 = 0111 0101 Þ 1011 1010 = BA

SHL и SHR - логический сдвиг влево и вправо. Выдвигаемый бит теряется, а в освобождаемый записывается 0. Например:

SHR DH, CL

(CL) = 2

(DH) = 93 = 1001 0011 Þ 0100 1001 Þ 0010 0100 =24

SAL и SAR - арифметический сдвиг влево и вправо. Сдвиг влево не отличается от логического, а при сдвиге вправо знаковый разряд не сдвигается, а тиражируется. Эти команды практически реализуют умножение и деление на степень двойки.

Команды передачи управления.

В линейных программах команды размещаются в памяти по порядку и для выбора следующей команды достаточно увеличить счетчик команд IP. На практике линейными программами обойтись нельзя. В циклических и ветвящихся программах, а также при вызове подпрограмм требуется выполнять не следующую по порядку команду, а команду с адресом перехода. Для этого служат команды передачи управления, которые модифицируют регистры CS и IP. Сегментная организация памяти определяет два типа команд передачи управления - близкие (NEAR), когда передача происходит внутри сегмента - изменяется только IP и далекие (FAR), когда управление передается за пределы текущего сегмента и надо менять пару CS : IP.

БЕЗУСЛОВНОГО ПЕРЕХОДА.

JMP dst

Если операнд представляет собой метку, то происходит передача управления команде с этой меткой. В остальных случаях управление передается команде, адрес которой содержится в регистре или ячейке памяти. Например

JMP E8 ;смещение отрицательное Е8 = -18. значит будет переход назад на

(PC) = 1240 18 байт.

(IP) = 1228

JMP BX ;переход на адрес, указанный в регистре BX

(BX) = 3000

(IP) = 3000

M0: ; пример бесконечного цикла.

ADD AX, 01h

ADD AX, BX

SHL CX, 1

JMP M0

УСЛОВНОГО ПЕРЕХОДА.

Всего 19 штук. Анализируют состояние флажков по некоторому условию. Если условие истинно - происходит короткий переход, если нет - выполняется следующая по порядку команда. При необходимости передать управление за пределы действия команды условного перехода - используется дополнительно команда JMP.

JC - переход если есть перенос.

JE - переход если равно.

JG - переход если больше.

JL - переход если меньше.

JS - переход если отрицательное.

JZ - переход если нуль.

MOV AX, 255 ;(AX) = 00FF, (SF) = 1

AND AL, AL ;флаг SF не изменяется

JS NEXT ; Будет выполнена передача управления на метку NEXT

ВЫЗОВА ПОДПРОГРАММ.

CALL dst ;Обращение к процедуре. Если операнд является меткой, то управление передается команде с этой меткой. В остальных случаях - команде, адрес которой содержимся в регистре или памяти. Вызов может быть внутрисегментным (NEAR) или межсегментным (FAR). Практически выполняет те же действия, что и команда JMP. Дополнительно: Адрес возврата сохраняется в стеке. В процедуре должна быть команда возврата RET. Пример рассмотрим позднее.

УПРАВЛЕНИЯ ЦИКЛАМИ.

LOOP lab

В качестве счетчика цикла используется регистр CX. Команда LOOP уменьшает на 1 его содержимое и если оно не равно нуль передает управление по адресу (внутрисегментному - NEAR), указанному в операнде (Это может быть метка, регистр или ячейка памяти). Например:

MOV CX, 10 ;Число циклов

M0:

ADD AX, 01h

ADD AX, BX

SHL CX, 1

LOOP M0 ;Уменьшает CX и повторяет цикл если не ноль

Команда эквивалентна двум: DEC CX

JNZ M0

ПРЕРЫВАНИЯ.

INT num ;Генерирует программное прерывание с номером num. (Аналогично внешним прерываниям по входу INT). Сохраняет в стеке регистр флагов, обнуляет TF (флаг трассировки) и IF(флаг прерываний), затем сохраняет CS : IP и загружает новое значение CS : IP из таблицы векторов. Широко применяются прерывания DOS и BIOS. Их использование мы рассмотрим позднее.