AAS ASCII-коррекция регистра AL после вычитания




Команда aas используется вслед за операцией вычитания одного не­упакованного двоично-десятичного числа (BCD) из другого в AL. Коман­да не имеет параметров. Она преобразует результат вычитания в неупако­ванное двоично-десятичное число. Если результат вычитания оказывается меньше 0, выполняется декремент содержимого регистра АН. Команда воздействует на флаги AF и CF; после ее выполнения AF=1, CF=1.


Пример

mov mov sub aas


AX,0708h;Неупакованное BCD 78

CL,09h;Неупакованное BCD 9

AL,CL;AX=07FFh

;AX=0609h, неупакованное BCD 69


ADC Целочисленное сложение с переносом

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



Приложение


adc можно указывать регистр (кроме сегментного) или ячейку памяти, в качестве второго — регистр (кроме сегментного), ячейку памяти или не­посредственное значение, однако не допускается определять оба операн­да одновременно как ячейки памяти. Операнды могут быть байтами или словами и представлять числа со знаком или без знака. Команда adc (со­вместно с командой add) обычно используется для сложения 32-разряд­ных чисел. Команда воздействует на флаги OF, SF, ZF, AF, PF и CF.


Пример 1

OV

adc


АХД12511 AX,2C25h


;AX=3D4Bh, если CF был = 1;AX=3D4Ali, если CF был = О


 


Пример 2

;В полях данных: numlow dw OFFFFh numliigh dw 0005h

;B программном сегменте: mov AX.OOOSh mov BX,0002h

add adc

AX, numlow BX, numliigh


;Младшая часть 2-го слагаемого;Старшая часть 2-го слагаемого;Число 0005FFFFh=393215

;Младшая часть 1-го слагаемого
;Старшая часть 1-го слагаемого
;Число 00020005h=131077
;Сложение младших частей. АХ=4, CF— 1
;Сложение старших частей с |;

;переносом.ВХ:АХ=0008;0004Ь. \\

;Число 00080004h=524292 \*


386+ Допустимо использование 32-битовых операндов и дополнитель­ных режимов адресации 32-разрядных процессоров. Команда adc с 32-раз­рядными операндами может использоваться для сложения 64-разрядных целых чисел.


Пример

;В полях данных meni321 dd OFFFFFFFFli mein32h dd 98765432h;B программном сегменте mov EAX,1 mov EBX,0 add EAX,mem321

adc EBX,mem32h


;Младшая часть 1-го слагаемого;Старшая часть 1-го слагаемого

;Младшая часть 2-го слагаемого;Старшая часть 2-го слагаемого;Складываем младшие половины;Сумма=1000000001г>32 бит;EAX=OOOOOOh, перенос;Складьшаем старшие половины;и перенос. EBX=90000001h ;Сумма: 987654330000000011


'-Система команд процессоров Intel



ADD Целочисленное сложение

Команда add осуществляет сложение первого и второго операндов. Исходное значение первого операнда (приемника) теряется, замещаясь результатом сложения. Второй операнд не изменяется. В качестве первого операнда команды add можно указывать регистр (кроме сегментного) или ячейку памяти, в качестве второго — регистр (кроме сегментного), ячей­ку памяти или непосредственное значение, однако не допускается опре­делять оба операнда одновременно как ячейки памяти. Операнды могут быть байтами или словами и представлять числа со знаком или без знака. Команду add можно использовать для сложения как обычных целых чи­сел, так и двоично-десятичных (с использованием регистра АХ для хра­нения результата). Если складываются неупакованные двоично-десятич­ные (BCD) числа, после команды add следует использовать команду ааа; если складываются упакованные числа, то команду daa. Команда воздей­ствует на флаги OF, SF, ZF, AF, PF и CF.


Пример 1

mov BX,lFFEh

mov CX,3

add BX,CX


;BX=2001h, CX=0003h


 


Пример 2

mov add


AX,25h AX,I2h


;AX=0037h


 


Пример 3

;B полях данных: mem dw 128;B программном сегменте: add mem, 100

Пример 4

mov AX,0507h add AL,05h aaa

Пример 5

mov AL,57h add AL,05h aaa


;mcm=228

;BCD распакованное 57;BCD 5, AX=050Ch;AX=0602h, BCD 62

;BCD упакованное 57;BCD 5, AL=5Ch;AL=62h, BCD 62


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


Пример

mov EAX,98765432h add EAX,llllllllh


;EAX=A9876543h



Приложение


AND Логическое И

Команда and осуществляет логическое (побитовое) умножение пер­вого операнда на второй. Исходное значение первого операнда (приемни­ка) теряется, замещаясь результатом умножения. В качестве первого опе­ранда команды and можно указывать регистр (кроме сегментного) или ячейку памяти, в качестве второго — регистр (кроме сегментного), ячей­ку памяти или непосредственное значение, однако не допускается опре­делять оба операнда одновременно как ячейки памяти. Операнды могут быть байтами или словами. Команда воздействует на флаги SF, ZF и PF.

Правила побитового умножения:

Первый операнд-бит 0101

Второй операнд-бит 0011

Бит результата 0001

Пример 1

mov AX,OFFEh

and AX,5555h;AX=0554h

Пример 2

; В полях данных:

mem dw ОСООЗп '

;В программном сегменте:

mov AXJOOEh

and AX.mem;AX=4002h

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


Пример

mov and


EDX,OFA880041h EDX,OFFOOOOOFli


;EDX=FA000001h


386P+ ARPL

Коррекция запрашиваемого уровня привилегий селектора

Команда aprl сравнивает селектор с образцом, содержащим макси­мально допустимый уровень привилегий (обычно используется селектор CS) и устанавливает проверяемое значение в соответствии с меньшим из двух уровней привилегий. Если изменение уровня не потребовалось, флаг ZF сбрасывается, если потребовалось — устанавливается. В качестве пер­вого операнда команды aprl может использоваться 16-разрядный регистр или слово памяти с проверяемым селектором; в качестве второго операн­да — 16-разрядный регистр с селектором-образцом.

386+ BOUND

Проверка индекса массива на выход за границы массива

Команда bound проверяет, лежит ли указанный индекс, рассматрива­емый, как число со знаком, внутри заданных вторым операндом границ.


Система команд процессоров Intel



Если индекс выходит за границы массива снизу или сверху, генерируется прерывание с вектором 5. Первый операнд должен быть регистром, содер­жащим проверяемый индекс, второй — адресом поля памяти с двумя границами проверяемого массива. В команде bound допустимо использо­вание как 16-битовых, так и 32-битовых операндов (но и первый, и вто­рой операнды должны быть одного типа).

386+ BSF Прямое сканирование битов

Команда bsf сканирует слово или двойное слово в поисках бита, рав­ного 1. Сканирование выполняется от младшего бита (0) к старшему. Если в слове не найдено установленных битов, то устанавливается флаг ZF. Если установленные биты есть, то номер первого установленного бита заносится в указанный в команде регистр. Номером бита считается -его позиция в слове, отсчитываемая от бита 0. В качестве первого операнда команды bsf следует указывать регистр, куда будет помещен результат ска­нирования, в качестве второго — регистр или ячейку памяти со сканиру­емым словом. В команде bsf допустимо использование как 16-битовых, так и 32-битовых операндов (но и первый, и второй операнды должны быть одного типа).


Пример 1

mov BX,70h bsf AX,BX


;Анализируемое данное;AX=4, ZF=0


 


Пример 2 mov bsf Пример 3 mov bsf SI,0 BX,SI SI,8 BX,SI

;Анализируемое данное;ZF=1, в ВХ прежнее значение

;Анализируемое данное;ВХ=3, ZF=1


Пример 4

;Анализируемое данное;AX=OOOCh=12, ZF=0

;B полях данных mem dw 9000h;B программном сегменте: bsf AX, mem

386+ BSR Обратное сканирование битов

Команда bsf сканирует слово или двойное слово в поисках бита, равно­го 1. Сканирование выполняется от старшего бита (15 или 31) к младшему. Если в слове не найдено установленных битов, то устанавливается флаг ZF. Если установленные биты есть, то номер первого установленного бита за­носится в указанный в команде регистр. Номером бита считается его пози­ция в слове, отсчитываемая от бита 0. В качестве первого операнда команды bsf следует указывать регистр, куда будет помещен результат сканирования, в качестве второго — регистр или ячейку- памяти со сканируемым словом. В



Приложение


 


команде bsf допустимо использование как 16-битовых, так и 32-битовых операндов, но и первый, и второй операнды должны быть одного типа (за исключением случая, когда второй операнд — константа).

 

Пример 1 raov bsr Пример 2 mov bsr Пример 3 mov bsf BX,70h AX.BX SI,0 BX,SI SI.8 BX,SI

;Анализируемое данное;АХ=6, ZF=0

;Анализируемое данное;ZF=1, в ВХ прежнее значение

;Анализируемое данное;ВХ=3, ZF=1


 


Пример 4

;B полях данных mem dw 9000h;B программном сегменте: bsr AX, mem


;Анализируемое данное;AX=OOOFli=15, ZF=0


486+ BSWAP Обмен байтов

Команда bswap изменяет порядок байтов в своем единственном опе­ранде, в качестве которого может выступать только 32-разрядный регистр общего назначения. Биты 7...О обмениваются с битами 31...24, а биты 15...18 с битами 23...16. Другими словами, нумерация байтов регистра изменяет­ся на противополжную (вместо 3, 2, 1, 0 — О, 1, 2, 3). Команда не воздей­ствует на флаги процессора.

!

Пример | \

mov ЕАХ, 01234567h ',[

bswap ЕАХ;EAX=67453420h

i

386+ ВТ Проверка бита

Команда Ыпозволяет определить, установлен ли в заданном слове определенный бит. Анализируемое слово выступает в качестве первого операнда, номер бита — в качестве второго. Первым операндом команды bt может служить регистр или ячейка памяти, вторым — регистр или не­посредственное значение. В команде допустимо использование как 16-би­товых, так и 32-битовых операндов, но и первый, и второй операнды должны быть одного типа (за исключением случая, когда второй операнд — константа).

Значение проверяемого бита копируется.в флаг CF,

Пример 1

mov AX.OOFFh;Анализируемое данное ЫАХ,5;бит5 = 1, ZF=1


1влш команд процессоров Mel



 


Пример 2

mov bt

Пример 3

mov bt


AX,OOFFh AX,8

AX,8001h

BX,15

AX,BX


;Анализируемое данное;бит 8=0, ZF=0

;Анализируемое данное;Номер проверяемого бита;бит 15 = 1, ZF=1


 


Пример 4

;B полях данных mem dw IFh;B профаммном сегменте: bt mem,4


;Анализируемое данное;бит4= 1, ZF=1


386+ ВТС Проверка и инверсия бита

Команда btc проверяет определенный бит в слове, заданном первым операндом, копирует его значение в флаг CF и инвертирует. Номер бита выступает в качестве второго операнда. Первым операндом команды btc может служить регистр или ячейка памяти, вторым — регистр или непос­редственное значение. В команде допустимо использование как 16-бито­вых, так и 32-битовых операндов, но и первый, и второй операнды дол­жны быть одного типа (за исключением случая, когда второй операнд — константа).


Пример 1

mov AX,OOFFh btc AX, 5


;Анализируемое данное;AX=OOCDh Бит 5 был = 1;Сброс бита 5, ZF=1


 


Пример 2

mov AX,OOFFh btc AX,8


;Анализируемое данное;AX=lFFh Бит 8 был = О;Установка бита 8, ZF=0


 


Пример З

mov AX,8001h

mov BX,15

btc AX,BX

Пример 4

;B полях данных mem dw IFh;B профаммном сегменте: btc mem,l


;Анализируемое данное;Номер проверяемого бита;AX=0001h, ZF=1

;Анализируемое данное;mem=lEh, ZF=1



Приложение


386+ BTR Проверка и сброс бита

Команда Ыг проверяет определенный бит в слове, заданном первым операндом, копирует его значение в флаг CF и сбрасывает. Номер бита выступает в качестве второго операнда. Первым операндом команды Ыг может служить регистр или ячейка памяти, вторым — регистр или непос­редственное значение. В команде допустимо использование как 16-бито­вых, так и 32-битовых операндов, но и первый, и второй операнды дол­жны быть одного типа (за исключением случая, когда второй операнд — константа).


Пример 1

111OV ЫГ


AX.OOFFh АХ, 5


;Анализируемое данное;AX=OOCDh Бит 5 был = 1;Сброс бита 5, ZF=1


 


Пример 2

mov AX.OOFFh btr AX,8


;Анализируемое данное;AX=OFFh Бит 8 был =0;Остался О, ZF=0


 


Пример 3

mov АХ.800Ш

mov BX,15

btc AX,BX


;Анализируемое данное;Номср проверяемого бита;АХ=0001Ь Бит 15 был = 1;Сброс бита 15, ZF=1


 


Пример 4

;В полях данных mem dw IFh;В программном сегменте: btc mem,10


;Анализируемое данное;mem=lFli Бит 10 был = О;Остался О, ZF=0


386+ BTS Проверка и установка бита

Команда bts проверяет определенный бит в слове, заданном первым операндом, копирует его значение в флаг CF и устанавливает. Номер бита выступает в качестве второго операнда. Первым операндом команды bts может служить регистр или ячейка памяти, вторым — регистр или непос­редственное значение. В команде допустимо использование как 16-бито­вых, так и 32-битовых операндов, но и первый, и второй операнды дол­жны быть одного типа (за исключением случая, когда второй операнд — константа).


Пример 1

mov AX,OOFFh btc AX,5


;Анализируемое данное;AX=OOCDh Бит 5 был = 1;Остался 1, ZF=1


Система команд процессоров Intel



 


Пример 2

mov AX.OOFFh btc AX, 8


;Анализируемое данное;AX=lFFh Бит 8 был = О;Установка бита 8, ZF=0


 


Пример 3

mov AX.SOOlh

mov ВХД5

btc AX,BX


;Анализируемое данное;Номер проверяемого бита;АХ=0001п Бит 15 был = 1; Остался 1, ZF=1


 


Пример 4

;B полях данных mem dw IFh;B программном сегменте: btc mem, 10


;Анализируемое данное

;me-ra=41Fh Бит 10 был = О;Установка бита 10, ZF=0


 

CALL Вызов подпрограммы

Команда call передает управление подпрограмме, сохранив перед этим в стеке смещение к точке возврата. Команда ret, которой обычно заканчи­вается подпрограмма, забирает из стека адрес возврата и возвращает уп­равление на команду, следующую за командой call. Команда не воздей­ствует на флаги процессора.

Команда call имеет четыре модификации:

- вызов прямой ближний (в пределах текущего программного сегмента);

- вызов прямой дальний (вызов подпрограммы, расположенной в дру-
программном сегменте);

- вызов косвенный ближний;

- вызов косвенный дальний.

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

near ptr — прямой ближний вызов;

far ptr — прямой дальний вызов;

word ptr — косвенный ближний вызов;

dword ptr — косвенный дальний вызов.

Команда call прямого ближнего вызова заносит в стек относительный адрес точки возврата в текущем программном сегменте и модифицирует IP так, чтобы в нем содержался относительный адрес точки перехода в том же программном сегменте. Необходимая для вычисления этого адреса величина смещения от точки возврата до точки перехода содержится в коде команды, который занимает 3 байт (код операции E8h и смещение к точке перехода).

Команда call прямого дальнего вызова заносит в стек два слова — сначала сегментный адрес текущего программного сегмента, а затем (выше,



Приложение


в слово с меньшим адресом) относительный адрес точки возврата в теку­щем программном сегменте. Далее модифицируются регистры IP и CS: в IP помещается относительный адрес точки перехода в том сегменте, куда осуществляется переход, а в CS — сегментный адрес этого сегмента. Обе эти величины берутся из кода команды, который занимает 5 байтов (код операции 9Ali, относительный адрес вызываемой подпрограммы и ее сег­ментный адрес).

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

Примеры прямого ближнего вызова

call near ptr subl;Вызов подпрограммы subl

;из того же сегмента
call subl;To же самое

Косвенные ближние вызовы


Пример 1

mov call


BX.oflset subl BX


;ВХ=адрес подпрограммы; Вызов подпрограммы


 


 

Пример 2

;В полях данных:

addr dw sub 1

;В программном сегменте: call DS:addr call word ptr addr

Пример 3

;B полях данных: addr dw sub 1;B программном сегменте: mov SI,offset addr

call [SI]

Пример 4

dw dw

;B полях данных: tbl dw subl

sub2 sub3

;B программном сегменте: mov BX,onset tbl


;Ячейка с адресом подпрограммы

;Вызов подпрограммы;То же самое

;Ячейка с адресом подпрограммы

;51=адрес ячейки с адресом

подпрограммы

;Вызов подпрограммы

;Ячейка с адресом подпрограммы 1;Ячейка с адресом подпрограммы 2;Ячейка с адресе подпрограммы 3

;ВХ=адрес таблицы адресов подпрограмм


чем а команд процессоров Intel



 


mov call


SI,2;51=смещение к адресу sub2

[BX][SI];Вызов подпрограммы 2


Пример прямого дальнего вызова

call far ptr subl;Вызов подпрограммы sub2, расположенной в другом Программном сегменте

Косвенные дальние вызовы

Пример 1

;В полях данных:

addr dd subl;Поле с двухсловным

;адресом подпрограммы;В программном сегменте:

call DS:addr;Вызов подпрограммы

call dword ptr addr;To же самое


Пример 2

;В полях данных: addr dd subl

;В программном сегменте: mov Dl.offset addr

call [DI]

Пример 3

;B полях данных: ч tbl dd subl

dd sub2

dd sub3;B программном сегменте:

mov SI,offset tbl

mov DI,8

call [SI][DI]


;Поле с двухсловным;адресом подпрограммы

;В1=адрес поля с адресом

подпрограммы

; Вызов подпрограммы

;Адрес подпрограммы 1;Адрес подпрограммы 2;Адрес подпрограммы 3

;О1=адрес таблицы адресов;Смещение к адресу sub3;Вызов подпрограммы sub3


386+ Допустимо использование дополнительных режимов адресации 32-разрядных процессоров. В 32-разрядных приложениях допустимо исполь­зование 32-битовых операндов. В защищенном режиме роль сегментного адреса выполняет селектор.


Примеры

call [EAX] call 8[ECX]


; Кос венный вызов; Кос венный вызов



Приложение


CBW Преобразование байта в слово

Команда cbw заполняет регистр АН знаковым битом числа, находя­щегося в регистре AL, что дает возможность выполнять арифметические операции над исходным операндом-байтом, как над словом в регистре АХ. Команда не имеет параметров и не воздействует на флаги процессора.


Пример 1

mov cbw

Пример 2

mov cbw


AL,5

AL,-2


;AX=0005h

;AL=FEh=-2 (байт);AX=FFFEh=-2 (слово)


386+ CDQ Преобразование двойного слова в четверное

Команда cdq расширяет знак двойного слова в регистре ЕАХ на регистр EDX. Эту команду можно использовать для образования четырехсловного делимого из двухсловного перед операцией двухсловного деления. Команда не имеет параметров и не воздействует на флаги процессора.


Пример 1

;В полях данных

mem dd -I

;В программном сегменте

mov EAX,mem

cdq

Пример 2

;В полях данных

mem dd 7FFFFFFFh

;В программном сегменте

mov ЕАХ, mem

cdq


; Отрицательное число

;EAX=FFFFFFFEh;EDX=FFFFFFFFh, EAX=FFFFFFFEh

;Положительное число

• EAX=7FFFFFFEh jEDX=OOOOOOOOh, EAX=7FFFFFFEh


CLC Сброс флага переноса

Команда clc сбрасывает флаг переноса CF в регистре флагов. Команда не имеет параметров и не воздействует на остальные флаги процессора..


Пример

clc


;CF=0, независимо от;исходного состояния


CLD Сброс флага направления

Команда eld сбрасывает флаг направления DF в регистре флагов, ус-танашшвая прямое (в порядке возрастания адресов) направление выпол­нения операций со строками (цепочками). Команда не имеет параметров и не воздействует на остальные флаги процессора.


Система команд процессоров Intel_________________________________________ 211

Пример

eld;DF=0, независимо от

;исходного состояния

CLI Сброс флага прерываний

Команда sti сбрасывает флаг разрешения прерываний IF в регистре флагов, запрещая (до установки этого флага командой sti) все аппарат­ные прерывания (от таймера, клавиатуры, дисков и т.д.). Команда не зап­рещает процессору выполнение команды int (реализация программных прерываний); также не запрещаются немаскируемые прерывания, посту­пающие на вход NMI микропроцессора. Команда не имеет параметров и не воздействует на остальные флаги процессора.

Пример

cli;IF=0, независимо от

;исходного состояния

386Р+ CLTS Сброс флага переключения задачи в управляющем регистре О

Команда cits сбрасывает флаг TS в регистре CRO.

CMC Инвертирование флага переноса

Команда стс изменяет значение флага переноса CF в регистре флагов на обратное. Команда не имеет операндов и не воздействует на остальные флаги процессора.

Пример

стс;Состояние флага CF

;изменяется на обратное

СМР Сравнение

Команда стр выполняет вычитание второго операнда из первого. В соответствии с результатом вычитания устанавливаются состояния фла­гов CF, PF, AF, ZF, SF и OF. Сами операнды не изменяются. Таким образом, если команду сравнения записать в общем виде

стр операнд_1, операнд_2

то ее действие можно условно изобразить следующим образом: операнд_1 — операнд_2 ' флаги процессора

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



Приложение


сора. При сравнении чисел без знака необходимо использовать команды
условных переходов, предназначенные для анализа чисел без знака (ja, jb
и проч.). При сравнении чисел со знаком необходимо использовать ко­
манды условных переходов, предназначенные для анализа чисел со зна­
ком (jl, JS и проч.)..


Пример 1

стр


АХ, 10000 eq10000


; АХ-10000

;Переход на метку eqlOOOO,

;если АХ= 10000


 


Пример 2

;В полях данных:

base dw 8002U

;В программном сегменте:

cmp DX.base

jb below


DX-base

;Переход на метку below,;если DX, рассматриваемое;как число без знака, меньше;числа без знака 8002h=32770


 


Пример 3

;В полях данных: base dw 8002h;В программном сегменте: cmp DX,base

jl less


DX-base

;Переход на метку less, если;DX, рассматриваемое как;число со знаком, меньше;числа со знаком 8002h=-32766


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


Пример

cnip ja


EAX,80000000h above


;Переход, если

; ЕАХ=80000001 h... FFFFFFFFh


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

С MRS В Сравнение строк по байтам

CMPSW Сравнение строк по словам

Команды предназначены для операций над строками (строкой назы­вается последовательность байтов или слов памяти с любым содержи­мым). Они сравнивают по одному элементу каждой строки, фактически


Система команд процессоров Intel



осуществляя вычитание второго операнда из первого и устанавливая в соответствии с результатом вычитания флаги CF, PF, AF, ZF, SF и OF. Команда cmpsb выполняет сравнение по байтам, команда cmpsw — по словам, а команда cmps может быть использована для сравнения как бай­тов, так и слов. В последнем случае размер сравниваемых элементов опре­деляется их описанием (с помощью директив db или dw). Первый операнд адресуется через DS:SI, второй — через ES:DI. Таким образом, операцию сравнения можно условно изобразить следующим образом:

(DS:SI) — (ES:DI) ~» флаги процессора

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

Вариант команды cmps имеет формат

cmps строка_1, строка_2

(что не избавляет от необходимости инициализировать регистры DS:SI и ES:DI адресами строк строка_1 и строка_2 соответственно). В этом форма­те возможна замена сегмента первой строки:

cmps Е$:строка_], строка_2

Рассматриваемые команды могут предваряться префиксами повторе­ния repe/repz (повторять, пока элементы равны, т.е. до первого неравен­ства) и repne/repnz (повторять, пока элементы не равны, т.е. до первого равенства). В любом случае выполняется не более СХ операций над после­довательными элементами.

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

Пример 1

;В полях данных сегмента данных, адресуемого через DS:

strl db 'FILE.001';1-я строка

;В полях данных сегмента данных, адресуемого через ES:

str2 db 'FILE.012';В программном сегменте: eld mov SI,ofiset strl mov DI,offset str2 mov CX,8 repe cmpsb je equal notequ:

;2-я строка

;Сравнение вперед

;DS:SI -> strl

;ES:DI -> str2

;Длина сравниваемых строк

;Поиск различия в строках

;Переход, если строки

;совпадают

Продолжение, если строки

;не совпадают



Приложение


В примере 1 строки не совпадают, и команда je выполнена не будет. После завершения сравнения строк управление будет передано на метку notequ. Содержимое регистров в этой точке: СХ=1 (так как не выполнено сравнение одной последней пары символов), SI = <смещение strl> + 7, DI = <смещение strl> + 7 (выполнено сравнение 7 пар символов).

Пример 2

;В полях данных сегмента данных, адресуемого через DS:

strl db '12345678*90';1-я строка

;В полях данных сегмента данных, адресуемого через ES:

str2 db 'abcdefgh*ij';2-я строка

;В программном сегменте:

eld;Сравнение вперед

mov SI,oflset strl;DS:SI ' strl

mov Dl.oflset str2;ES:DI ' str2

mov CX,11;Длина сравниваемых строк

герце cmpsb;Поиск первой пары

;одинаковых элементов

jne notequ;Переход, если таковой нет

found: Продолжение, если пара

Одинаковых элементов найдена

В примере 2 имеется пара одинаковых элементов (*) в позиции 8 от начала строк. Поэтому команда jne выполнена не будет. После завершения сравнения строк управление будет передано на метку found. Содержимое регистров в этой точке: СХ=2 (так как не выполнено сравнение двух пос­ледних пар символов), SI = <смещение strl> + 9, DI = <смещенис strl> + 9 (выполнено сравнение 9 пар символов).

Пример 3

;В полях данных сегмента, адресуемого через ES: strl db *09Д2.1998';1-я строка str2 db *09.12.1998';2-я строка;В программном сегменте:

eld;Сравнение вперед

mov SI,onset strl;DS:SI ' strl

mov Dl.offset str2;ES:DI ' str2

mov CX,10;Длина сравниваемых строк

repe cmps ES:strl,ES:str2;Поиск различия в строках

je equal;Переход, если строки

;одинаковы

notequal: Продолжение, строки

различаются

В примере 3 строки одинаковы и после завершения сравнения управ­ление будет передано на метку equal. Поскольку строки описаны с помо­щью директив db, фактически выполняется команда cmpsb, т.е. побайто­вое сравнение.


8 Система команд процессоров Intel



 


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

386+ CMPSD Сравнение строк по двойным словам

Команда аналогична командам МП 86 cmpsb и cmpsw, но позволяет сравнивать 32-битовые участки строк, адресуемых через регистры DS:ESI и ES:EDI (или, в 16-разрядных приложениях, через DS:SI и ES:DI). Исполь­зование мнемоники cmpsd с префиксом гер не означает, что в качестве счетчика будет автоматически использоваться расширенный регистр ЕСХ.

Пример

;В полях данных сегмента, адресуемого через DS areal dd 152345,168666,954333 area2 dd 152345,168666,954331;B программном сегменте push DS

pop mov mov mov cmpsd je equal

ES;ES=DS

SI,offset areal;DS:SI -» areal

DI,oflset area2;ES:DI -> area2

CX,3

; Будем сравнивать 3 числа

repe

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

486+ CMPXCHG Сравнение и обмен

Команда cmpxchg выполняет в одной операции сравнение и обмен операндов. Команда требует два параметра и неявным образом использует третий операнд — регистр ЕАХ. Первый операнд (приемник) должен на­ходиться в 16- или 32-битовой ячейке памяти, второй операнд (источ­ник) — в регистре общего назначения такого же размера. Команда выпол­няет сравнение операнда-приемника с содержимым неявного операнда — регистра ЕАХ. Если сравниваемые значения совпадают, операнд-при­емник замещается операндом-источником (т.е. содержимое регистра за­писывается в память). Если сравниваемые значения не совпадают, содер­жимое памяти (приемник) поступает в регистр ЕАХ (рис. Ш). Команда воздействует на флаги OF, SF, ZF, AF, PF и CF.

Если равны

CMPXCHG память, регистр

t I

Сравнение | Если ие равны

v т

ЕАХ

Рис. Ш. Действие команды cmpxchg.



Приложение


 


 


 

Пример 1

;В полях данных mem dw 135;В программном сегменте

mov АХД35

mov BX,60

cmpxchg mem,BX

Пример 2

;В полях данных mem dw 135;В программном сегменте

mov AX, 148

mov BX,60

cmpxchg mem,BX


;mem=AX. Регистр -» память;mem=60, ВХ=60, AX=135

;mem<>AX. Память -> АХ;mem=135, BX=60, АХ=148


Pentium+ CMPXCHG8B Сравнение и обмен 8 байтов

Команда cmpxchgSb выполняет в одной операции сравнение и обмен 8-байтовых операндов. Команда требует один параметр и неявным обра­зом использует еще два операнда — пары регистров EDXiEAX и ЕСХ:ЕВХ. В качестве явного операнда команды (приемника) может выступать толь­ко 64-битная (8-байтовая) ячейка памяти. Команда выполняет сравнение операнда-приемника в памяти с содержимым EDXrEAX. Если сравнивае­мые значения совпадают, то операнд-приемник в памяти замещается 64-битным значением ЕСХ:ЕВХ. Если сравниваемые значения не совпадают, содержимое памяти поступает в пару регистров EDX:EAX, замещая один из сравниваемых операндов (рис. П2). Команда воздействует на флаг ZF.

ЕСХ: ЕВХ

Если равны

CMPXCHGSB память

Сравнение | Если не равны

EDX:ЕАХ

Рис. П2. Действие команды cmpxchgSb.

Пример 1

;В полях данных

mem dq 1122334455667788h

;В программном сегменте

mov ECX,9

mov ЕВХ, 5


icmeua команд процессоров Intel



 


mov EDX,F1223344h mov EAX, 55667788h

cmpxchgSb mem;mem=EDX:EAX. ECX:EBX

;mem=0000000900000005h


mem


Пример 2

;B полях данньк

mem dq 1122334455667788h

;B программном сегменте

mov ECX,9

mov EBX,5

mov EDX, 11223344U

mov EAX,55667788h

cmpxcligSb mem;mem<>EDX:EAX. Mem -* EDX:EAX

;mem=1122334455667788h;EDX=11223344h, EAX=556677881i

При работе с многобайтовыми данными не следует забывать о том, что в памяти байты любых данных всегда выстраиваются в порядке их номеров,т.е. от младшим к все более старшим, в то время как при изобра­жении чисел мы применяем обратный порядок — сначала пишем стар­шие разряды числа, затем младшие. В то же время символьные строки мы изображаем так же, как они располагаются в памяти — для нас есте-

„ственно считать, что по мере движения по строке вправо номер символа

^возрастает.


Пример 3

;В полях данных

;Строка-операнд Сравниваемая строка

meml db ' 12345678'

meni2 db '12345678'

;B программном сегменте

mov ECX,68676665h;'efgh' mov EBX,64636261h;'abcd' mov EDX,dword ptr niem2+4;3абираем старшую

;часть строки mov EAX,dword ptr mem2;3абираем младшую

; часть строки

cmpxcligSb mem;Операнды совпадают, CF=1

;mem="abcdefgh";ECX:EBX без изменений;EDX:EAX без изменений


Пример 4

; В полях данных
me ml db

те т 2 db

;В программном


'12345678';Сгрока-операнд 'abcdefgh' уравниваемая строка



Приложение


mov EDX,dword ptr mem2+4;3абираем старшую

;часть строки mov EAX,dword ptr mem2;3абираем младшую

;часть строки
cmpxcligSb meml;Операнды не совпадают, CF=0

;EDX=38373635='5678'

;ЕАХ=34333231='Ш4'

;meml без изменения;При неравенстве ЕСХ:ЕВХ не принимают участие в операции

Pentium* CPUID Идентификация процессора

Команда cpuid позволяет получить код идентификации процессора, установленного на данном компьютере. Команда в качестве неявного опе­ранда использует регистр ЕАХ. Для процессоров Pentium регистр ЕАХ пе­ред вызовом команды cpuid может принимать два значения: 0 и 1. Если ЕАХ=0, то команда возвращает в регистре ЕАХ код 1, а в регистрах ЕВХ, EDX и ЕСХ (именно в таком порядке) — три части символьной строки, идентифицирующей изготовителя процессора. Для процессоров Intel воз­вращаемая строка в целом имеет вид «Genuinelntel».

Если перед вызовом команды cpuid значение ЕАХ равно 1, то коман­да возвращает в регистре ЕАХ коды разработки конкретной версии про­цессора, а в регистре EDX код IBFli, содержащий информацию о воз­можностях процессора.

Коды разработки в регистре ЕАХ хранятся в следующем формате:

биты 0... 3 — номер поколения (например, 3);

биты 4... 7 — модель (например, 4);

биты 8... 11 — семейство (5 для Pentium).

Содержимое регистра EDX включает конфиденциальную информа-* цию изготовителя, а также говорит о наличии на кристалле микропро4 цессора арифметического сопроцессора (бит 0) и поддержке команды

cmpxcligSb (бит 8). \

•^

г, V

Пример _ £

;В полях данных £

mem dd 0,0,0. f

;В программном сегменте I

mov ЕАХ, О I

cpuid;EAX=0001h |

mov mov cpuid
;mem='GenuineInter EAX=543h (например),EDX=IBFh

mov mem, EBX j
mem+4,EDX
mem+8,ECX

CWD Преобразование слова в двойное слово

Команда cwd заполняет регистр DX знаковым битом содержимого регистра АХ, преобразуя тем самым 16-разрядное число со знаком в 32-разрядное, размещаемое в регистрах DX:AX. Команду удобно использо-


Система команд процессоров Intel



вать для преобразования двухбайтового делимого в четырехбайтовое (двой­ное слово) при делении на 16-разрядный операнд. Команда не имеет па­раметров и не воздействует на флаги процессора.


Пример 1

mov AX,32767 cwd


;AX=7FFFh;AX=7FFFh, DX=OOOOh.;DX:AX=32767


 


Пример 2

111OV

cwd


АХ,-32768


;AX=8000h

;AX=8000h, DX=FFFFh.

;DX:AX=-32768


386+ CWDE

Преобразование слова в двойное слово с расширением

Команда cwde заполняет старшую половину регистра ЕАХ знаковым битом содержимого регистра АХ, преобразуя тем самым 16-разрядное число со знаком в 32-разрядное, размещаемое в расширенном регистре ЕАХ. Команда не имеет операндов и не воздействует на флаги процессора.

Пример

;В полях данных

mem dw -3

;В программном сегменте

;AX=FFFD ;EAX=FFFFFFFDh

mov AX,niem

cwde

DAA Десятичная коррекция в регистре AL после сложения

Команда daa корректирует результат сложения в регистре AL двух упа­кованных двоично-десятичных (BCD) чисел (по одной цифре в каждом 'полубайте), чтобы получить пару правильных упакованных двоично-деся-| тачных цифр. Команда используется вслед за операцией сложения упако-• ванных двоично-десятичных чисел. Если результат сложения превышает 99, возникает перенос и устанавливается флаг CF. Команда воздействует,на флаги SF, ZF, AF, PF и CF.


Пример 1

mov AL,87h add AL,04h daa

Пример 2

mov AL,87h add AL,llh daa


;Упакованное BCD 87;После сложения AL=8Bh;AL=91h, т.е. упакованное BCD 91

;Упакованное BCD 87;После сложения AL=971i;AL=97h, т.е. упакованное;BCD 97 (в данном случае;команда daa ничего не делает)



Приложение


 


DAS Десятичная коррекция в регистре AL после вычитания

Команда das. корректирует результат вычитания в регист



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2016-02-16 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: