Команда 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. корректирует результат вычитания в регист