Главная Обратная связь

Дисциплины:






команды сдвига SHR, SHL, RCL, RCR, ROL, ROR. Их работа и примеры использования



Функции сдвига (сдвиг логический операнда влево/вправо)

SHL операнд, количество_сдвигов

SHR операнд, количество_сдвигов

SHL и SHR сдвигают биты операнда (регистр/память) влево или вправо соответственно на один разряд.

Указанное выше действие повторяется количество раз, равное значению второго операнда.

 

 

Пример:

; al = 01011011 (двоичное)

shr al, 3

Это означает: сдвиг всех битов регистра al на 3 разряда вправо. Так что al станет 00001011. Биты слева заполняются нулями, а биты справа выдвигаются. Последний выдвинутый бит, становится значением флага переноса cf.

Бит переноса это бит флагового регистра процессора. Этот регистр не такой как eax или ecx, к которому вы можете непосредственно обращаться (хотя есть опкоды, которые это делают), его содержание, зависит от результатов многих команд. Об этом я вам расскажу позже, единственное, что вы должны сейчас запомнить, это то, что флаг переноса это бит во флаговом регистре и что он может быть установлен (т.е. равен 1) или сброшен (равен 0).

Команда shl такая же, как и shr, но сдвигает влево.

; bl = 11100101 (двоичное)

shl bl, 2

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

Здесь есть еще два других опкода: (сдвиг арифметический операнда влево/вправо)

SAL операнд, количество_сдвигов

SAR операнд, количество_сдвигов

Команда SAL такая же, как SHL, а вот SAR не совсем такая, как SHR. Команда SAR также, как и SHR сдвигает все биты операнда вправо на один разряд, при этом выдвигаемый справа бит становится значением флага переноса cf.

Обратите внимание: одновременно слева в операнд вдвигается не нулевой бит, как в SHR, а значение старшего бита операнда. Пример:

al = 10100110

sar al, 3

al = 11110100

sar al, 2

al = 11111101

bl = 00100110

sar bl, 3

bl = 00000010

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

rol операнд, количество_сдвигов ; циклический сдвиг операнда влево

ror операнд, количество_сдвигов ; циклический сдвиг операнда вправо

rcl операнд, количество_сдвигов ; циклический сдвиг операнда влево через флаг переноса

rcr операнд, количество_сдвигов ; циклический сдвиг операнда вправо через флаг переноса

Циклический сдвиг напоминает смещение, выдвигаемые биты, снова вдвигаются с другой стороны:

Пример: команды ror (циклический сдвиг вправо)

Как видно из рисунка выше, биты вращаются, то есть каждый бит, который выталкивается снова вставляется с другой стороны. Флаг переноса cf содержит значение последнего выдвинутого бита.



RCL и RCR сдвигают все биты операнда влево (для RCL) или вправо (для RCR) на один разряд, при этом старший(для RCL) или младший(для RCR) бит становится значением флага переноса cf; одновременно старое значение флага переноса cf вдвигается в операнд справа(для RCL) или слева(для RCR) и становится значением младшего(для RCL) или старшего(для RCR) бита операнда. Указанные действия повторяются количество раз, равное значению второго операнда.

ROL и ROR сдвигают все биты операнда влево(для ROL) или вправо(для ROR) на один разряд, при этом старший(для ROL) или младший(для ROR) бит операнда вдвигается в операнд справа(для ROL) или слева(для ROR) и становится значением младшего(для ROL) или старшего(для ROR) бита операнда; одновременно выдвигаемый бит становится значением флага переноса cf. Указанные действия повторяются количество раз, равное значению второго операнда.

 

24. Три вида команд безусловного перехода JMP ***. Особенности их использования

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

jmp [модификатор] адрес_перехода

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

jmp m

m:

mov eax,1

Есть еще такой вариант (указывается не адрес перехода, а место, где он хранится):

lea eax,m

jmp eax

m:

mov eax,1

CMPS Сравнение строк

Команда CMPS сравнивает содержимое одной области памяти (адресуемой регистрами DS:SI) с содержимыми другой области (адресуемой как ES:DI). В зависимости от флага DF команда CMPS также увеличивает или уменьшает адреса в регистрах SI и DI на 1 для байта или на 2 для слова. Команда CMPS устанавливает флаги AF, CF, OF, PF, SF и ZF. При использовании префикса REP в регистре CX должна находиться длина сравниваемых полей. Команда CMPS может сравнивать любое число байт или слов.

Рассмотрим процесс сравнения двух строк, содержащих имена JEAN и JOAN. Сравнение побайтно слева направо приводит к следующему:

J : J Равно

E : O Не равно (E меньше O)

A : A Равно

N : N Равно

Сравнение всех четырех байт заканчивается сравнением N:N - pавно/нуль. Так как имена "не равны", операция должна пре кратиться, как только будет обнаружено условие "не равно". Для этих целей команда REP имеет модификацию REPE, которая повторяет сравнение до тех пор, пока сравниваемые элементы равны, или регистр CX не pавен нулю.

MOVS Пересылка данных из строки в строку

Команда предназначена для операций над строками (строкой называется последовательность байтов или слов памяти с любым содержимым). Она пересылает по одному элементу строки, который может быть байтом или словом. Первый операнд (приемник) адресуется через ES:DI, второй (источник) - через DS:SI. Операцию пересылки можно условно изобразить следующим образом:

(DS:SI) -> (ES:DI)

После каждой операции пересылки регистры SI и DI получают положительное (если флаг DF=0) или отрицательное (если флаг DF=1) приращение. Величина приращения составляет 1 или 2 в зависимости от размера пересылаемых элементов. Вариант команды movs имеет формат: movs строка_1, строка_2

В этом случае байты или слова из строки строка_2 пересылаются на место строки строка_1. Размер пересылаемых элементов определяется описанием строк (с помощью директив db или dw). Это не избавляет от необходимости инициализировать регистры ES:DI и DS:SI адресами строк строка _1 и строка_2. В этом формате возможна замена сегмента второй строки (источника): movs строка_1, ES:строка_2

Рассматриваемая команда может предваряться префиксом повторения rep (повторять СХ раз). После выполнения рассматриваемых команд регистры SI и DI указывают на ячейки памяти, находящиеся за теми (если DF=0) или перед теми (если DF=1) элементами строк, на которых закончились операции пересылки. Если флаг DF сброшен, то пары регистров DS:SI и ES:DI следует инициализировать начальными адресами строк-операндов; строка-источник будет пересылаться от се начала, в порядке возрастания номеров ее байтов. Если флаг DF установлен, то пары регистров DS:SI и ES:DI следует инициализировать конечными адресами строк-операндов; строка-источник будет пересылаться от ее конца, в порядке уменьшения номеров ее байтов. Команды не воздействует на флаги процессора.

26 Две команды умножения mul (multiplication,умножение) для умножения беззнаковых чисел и imul (integer multiplication, целочисленное умножение) для работы со знаковыми числами. Результаты их выполнения при одних и тех же операндах могут радикально различаться. Обе команды могут работать как со словами, так и с байтами. Они выполняют умножение числа, находящегося в регистрах АХ (в случае умножения на слово) или AL (в случае умножения на байт), на операнд, который может находиться в каком-либо регистре или в ячейке памяти. Не допускается умножение на непосредственное значение, а также на содержимое сегментного регистра. Размер произведения, т. е. число байтов в нем, всегда в два раза больше размера сомножителей. Для 1-байтовых операций полученное произведение записывается в регистр АХ. Для 2-байтовых операций результат умножения, который имеет размер 32 бита, записывается в регистры DX:AX (в DX - старшая половина, в АХ - младшая). Рассмотрим несколько конкретных примеров действия команд знакового и без- знакового умножения.

mov AL,3 ;Первый сомножитель-003

mov BL,2 ;Второй сомнозкитель=002

mul BL ;AX=0006h=00006

mov AL,3 ;Первый сомножитель-003

mov BL,2 ;Второй сомнозкитель=002

imul BL ;AX=0006h=+00006

Обе команды, mul и imul, дают в данном случае одинаковый результат, поскольку знаковые положительные числа совпадают с беззнаковымиmov

mov AL,0FFh ;Первый сомножитель=0FFh=255

mov BL,2 ; Второй сомножитель=002

mul BL ;AX=01FEh=00510

mov AL,0FFh ;Первый сомножитель=0FFh=255

mov BL,2 ; Второй сомножитель=002

imul BL ;AX=FFFEh=-00002

Здесь действие команд mul и imul над одними и теми же операндами дает разные результаты. В первом примере беззнаковое число FFh, которое интерпретируется как десятичное 255, умножается на 2, давая в результате беззнаковое 00510, или O1FEh. Во втором примере то же число FFh рассматривается как знаковое. В этом случае оно составляет -001. Умножение на 2 дает -002, или FFFEh.

Разная интерпретация одного и того же' числа FFh обусловлена использованием в первом случае команды для обработки беззнаковых чисел, а во втором - знаковых.

FFFFFFFEh. По-прежнему старшая половина этого числа (FFFFh) записывается в DX, младшая половина (FFFEh) - в АХ.

27команда DIV Деление целых беззнаковых чисел

Команда DIV выполняет деление целого числа без знака, находящегося в регистрах АХ (в случае деления на байт) или DX:AX (в случае деления на слово), на операнд- источник (целое число без знака). Размер делимого в два раза больше размеров делителя и остатка.

Для 1-байтовых операций делимое помещается в регистр АХ; после выполнения операции частное записывается в регистр AL, а остаток - в регистр АН.

Для 2-байтовых операций делимое помещается в регистры DX:AX (в DX - старшая часть, в АХ - младшая); после выполнения операции частное записывается в

регистр АХ, а остаток - в регистр DX.

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

Команду div можно использовать для целочисленного деления неупакованного двоично-десятичного числа в регистре АХ не неупакованный двоично-десятичный делитель, если перед ней выполнить команду aad.

386+ Допустимо использование 32-битовых операндов и дополнительных

режимов адресации 32-разрядных процессоров. При этом если делитель представляет

32-битовую величину, то возможен только один вариант команды деления, когда делимое находится в паре регистров EDX:EAX. В этом случае частное будет помещено в регистр ЕАХ, остаток - в EDX.

 





sdamzavas.net - 2019 год. Все права принадлежат их авторам! В случае нарушение авторского права, обращайтесь по форме обратной связи...