Главная | Обратная связь | Поможем написать вашу работу!
МегаЛекции

Команда TEST. 5.2 Команды сдвига. Команды SHL и SHR. Команды SAL и SAR. Команды ROL и ROR. Команды RCL и RCR. Контрольные вопросы




Команда TEST

Команда TEST аналогична команде AND за исключением того, что не меняет значений своих операндов, а лишь воздействует на флаги CF, OF, PF, SF и ZF (значение флага AF не определено).

Пример использования команды TEST:

A DB 0FFH

. . .

TEST A, 80H            ; сбрасываются CF, OF, PF, SF и ZF

MOV A, 0FH

TEST A, 10H            ; устанавливаются ZF и PF

 

5. 2 Команды сдвига

Команды SHL и SHR

Команды SHL и SHR являются командами логического сдвига. Команды сдвигают все биты своего операнда на 1 разряд или CL разрядов. Команда SHL сдвигает биты влево, а команда SHR – вправо. Те биты, которые в результате выполнения команд выходят за разрядную сетку заносятся во флаг CF. Освобождающиеся в результате сдвига биты заполняются нулями. Синтаксис команд SHL и SHR:

SHL < операнд>, < 1 или CL>

SHR < операнд>, < 1 или CL>

 

Первый операнд может быть 16- или 8-битным регистром (не сегментным) или ячейкой памяти с прямой или косвенной формой адресации. При использовании косвенной формы адресации необходимо указать тип операнда (8 или 16 бит) с использованием синтаксических конструкций “BYTE PTR” или “WORD PTR”. Второй операнд команд SHL и SHR может быть либо 1, что означает сдвиг на 1 разряд, либо регистром CL, что означает сдвиг на число разрядов, указанное в регистре CL. Использование в качестве второго операнда других выражений исключается.

Команды SHL и SHR можно использовать для быстрого умножения операнда на степени числа 2 (команда SHL) или деления (команда SHR). Однако следует отметить, что в этом случае команды SHL и SHR не учитывают знак операнда и их можно использовать только для умножения/деления беззнаковых чисел. Команды воздействует на флаги CF, OF, PF, SF и ZF (значение флага AF не определено).

Пример использования команд SHL и SHR:

MOV AL, 0FFH

MOV CL, 4

SHR AL, CL              ; AL = 0FH

SHL AL, CL              ; AL = 0F0H

SHR AL, 1                 ; AL = 78H

SHL AL, 1                 ; AL = 0F0H

Команды SAL и SAR

Команды SAL и SAR аналогичны командам SHL и SHR, но являются командами арифметического сдвига и учитывают знак операнда при сдвиге вправо. Это значит, что освобождающиеся в результате сдвига вправо старшие биты заполняются битом знака операнда. Так как знак операнда при сдвиге влево не имеет значения, команда SAL полностью идентична команде SHL, просто имеет другое мнемоническое обозначение.

Пример использования команды SAR:

MOV AL, -8

MOV CL, 2

SAR AL, CL              ; AL = -2

Команды ROL и ROR

Команды ROL и ROR являются командами циклического сдвига – они сдвигают свои операнды, и биты, которые при этом вышли за разрядную сетку слева (для команды ROL) или справа (для команды ROR), заносятся в освободившиеся биты справа или слева соответственно. Команда ROL сдвигает биты своего операнда влево, а команда ROR – вправо. Синтаксис и требования к операндам у команд ROL и ROR – такие же, как и для команд SHL и SHR.

Пример использования команд ROL и ROR:

X DB 11010111B

. . .

MOV CL, 4

ROL X, CL                ; X = 01111101B

ROR X, 1                   ; X = 10111110B

 

Команды RCL и RCR

Команды RCL и RCR аналогичны командам ROL и ROR, но выполняют циклические сдвиги через флаг переноса. Это означает, что при сдвиге операнда на 1 бит, тот бит, который вышел за разрядную сетку, заносится во флаг CF, а значение флага CF перед этим, в свою очередь заносится в освободившийся бит. При сдвиге операнда на несколько бит описанная операция повторяется CL раз. Команда RCL сдвигает биты операнды влево, а RCR – вправо.

Пример использования команд RСL и RСR (предполагается, что флаг CF установлен):

MOV BL, 01011100B

RCL BL, 1                 ; BL = 10111001B, CF сброшен

MOV CL, 3

RCR BL, CL    ; BL = 11001010B, CF установлен

 

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

1. Какие логические команды существуют для МП 8086?

2. Чем отличаются действия команд NOT и NEG?

3. Какими арифметическими и логическими командами можно заменить действие команды NEG?

4. В каких случаях выполнение команды OR дает такие же результаты, как выполнение команды ADD?

5. Какими способами можно обнулить регистр общего назначения?

6. Какая команда используется для быстрого умножения числа на степень числа 2?

7. Можно использовать команды логических сдвигов для умножения или деления чисел со знаком?

8. Какая команда учитывает знак операнда?

9. В каких командах используется знак переноса?

10. В какой регистр записывается количество сдвигов?

 

Задания

1. Чему равен результат логической операции:

X DW?

MOV X, 3

MOV AX, 7

XOR AX, X

2. Используя операции логического сдвига, напишите фрагмент программы для вычисления:

а) произведения числа 15 на 16;

б) частного от деления 256 на 32;

в) произведения числа 9 на 32.

3. Вычислите:

а) ((a ^ 2) – (b | 3)) / (2 + (c & 8)) *! d

б) (a ^ 4) * 5 – (! b + (c & 5 + d)) / 2 | 3

в) (! a – ((b | 6) / c ^ 3)) * (! d – 3) + 1

г) (a ^ 3) / ((b | 9) * (! c + 1)) – (d & 2)

 

 

6. КОМАНДЫ УСЛОВНЫХ И БЕЗУСЛОВНЫХ ПЕРЕХОДОВ, ОРГАНИЗАЦИЯ ЦИКЛОВ

 

6. 1 Команды условных и безусловных переходов

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

< команда_перехода> < адресное_выражение>

 

Для формирования флагов совместно с командами условных переходов используется команда CMP, действие которой аналогично команде SUB, но результат нигде не сохраняется. Команда CMP сравнивает два операнда (вычитает второй операнд из первого без сохранения результата) и устанавливает флаги в зависимости от результатов сравнения. Команда CMP, как правило, ставится сразу перед командой условного перехода.

Все мнемоники команд условного и безусловного переходов начинаются с буквы ‘J’, после которой следуют буквы, определяющие команду безусловного перехода или условия передачи управления командой условного перехода. В табл. 11 приведен список всех команд условных и безусловных переходов, а также условия (флаги), которые эти команды проверяют.

 

Таблица 11

Команды условных и безусловных переходов

Мнемоническое обозначение Условие перехода Проверяемые значения флагов
JMP безусловный переход Нет
JA / JNBE больше (для беззнаковых чисел) CF=0 и ZF=0
JAE / JNB больше или равно (для беззнаковых чисел) CF=0
JB / JNAE меньше (для беззнаковых чисел) CF=1
JBE / JNA меньше или равно (для беззнаковых чисел) CF=1 или AF=1
JC перенос CF=1
JCXZ CX равно нулю нет
JE / JZ равно ZF=1
JG / JNLE больше (для знаковых чисел) ZF=0 и SF и OF одинаковы (оба 0 или 1)
JGE / JNL больше или равно (для знаковых чисел) SF и OF одинаковы (оба 0 или 1)
JL / JNGE меньше (для знаковых чисел) SF и OF различны
JLE / JNG меньше или равно (для знаковых чисел) ZF=1 и SF и OF различны
JO переполнение OF=1
JNO нет переполнения OF=0
JP / JPE паритет четный PF=1
JNP / JPO паритет нечетный PF=0
JS знак SF=1
JNS нет знака SF=0
JNZ не нуль ZF=0

 

Переход (передача управления) выполняется, если флаги имеют значения, указанные в правой колонке таблицы.

Особо можно отметить команду JCXZ, которая не проверяет флаги, а выполняет переход, если значения регистра CX равно 0.

Из таблицы видно, что некоторые команды условных переходов имеют два различных мнемонических обозначения, но выполняют одни и те же действия. Это является довольно распространенным примером. Дополнительные мнемоники одной и той же команды процессора вводятся для удобства и логичности системы команд.

Команды переходов не оказывают влияния на флаги.

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

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

JMP < адресное_выражение>

Например:  JMP [BX]

 

В этом примере смещение, на которое передается управление командой JMP, находится в памяти по смещению, определяемому значением регистра BX.

Для непосредственной формы адресации используется следующий синтаксис:

JMP < имя_метки>

Например:

ADDR:

. . .

JMP ADDR                        ; переход на метку ADDR

Имя переменной определяет ячейку памяти, в которой хранится смещение для передачи управления.

Для прямой формы адресации используется следующий синтаксис:

JMP < имя_сег_регистра>: < смещение> или

JMP WORD PTR < имя_переменной>

Имя_сег_регистра – это CS, DS, SS или ES (префикс замены сегмента). Смещение – это непосредственно указываемое в команде числовое значение. Имя переменной определяет переменную, в которой хранится смещение.

Пример 1: JMP DS: 0040h

В этом примере управление передается на смещение, хранящееся в памяти по смещению 0040h.

Пример 2:

A DW 1000h

. . .

JMP WORD PTR A          ; передача управления

      ; на смещение 1000h

Все команды условных переходов являются короткими переходами и могут использовать только непосредственно указанные в команде смещения.

При указании в команде безусловного ближнего перехода непосредственного смещения управление передается на это смещение. Для указания непосредственного смещения в команде безусловного ближнего перехода указывается имя метки в этом же сегменте. Синтаксис в этом случае будет следующий:

JMP NEAR PTR < имя_метки>

Например:

M1:

. . .

JMP NEAR PTR M1

Конструкция “NEAR PTR” используется для обозначения не короткого, а именно ближнего перехода. Короткие безусловные переходы используют такой синтаксис:

JMP SHORT < имя_метки>

Например:

M1:

. . .

JMP SHORT M1

Для команд условного перехода указывать служебное слово SHORT ненужно, так как все команды условных переходов являются короткими переходами. При компиляции программы транслятор проверяет, находится ли метка на расстоянии +127 или –128 байт от команды короткого перехода. Если нет, то фиксируется ошибка. Транслятор Turbo Assembler также автоматически преобразует ближние безусловные переходы с непосредственным смещением в короткие, если это возможно. Если используется синтаксис вида:

JMP < имя_метки>

транслятор выбирает тип безусловного перехода (ближний или короткий) в зависимости от того, на каком расстоянии от команды перехода находится метка. Это справедливо, если метка находится перед командой перехода. Если метка находится после команды перехода, то транслятор всегда выбирает ближний тип перехода.

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

JMP FAR PTR < имя_метки>

 

Метка располагается в другом программном сегменте. Это будет дальний переход. Если метку расположить в том же программном сегменте, что и команду перехода, Turbo Assembler автоматически преобразует команду дальнего перехода в команду ближнего или короткого перехода. Пример использования команды дальнего перехода:

MySegment1 SEGMENT

. . .

M1:

. . .

MySegment1 ENDS

            

MySegment2 SEGMENT

. . .

JMP FAR PTR M1

. . .

MySegment2 ENDS

Синтаксис команды дальнего перехода с использованием косвенной формы адресации такой:

JMP DWORD PTR < адресное_выражение>

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

OFFS DW 0010H

SEGM DW 0400H

. . .

MOV BX, OFFSET OFFS

JMP DWORD PTR [BX]

В этом примере управление будет передано по адресу 0400: 0010 (сегмент: смещение).

 

Поделиться:





Воспользуйтесь поиском по сайту:



©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...