Cmps/cmpsb/cmpsw/cmpsd
Описание системы команд
Микропроцессоров Intel
Материал, приведенный в данном разделе справочной системы, связан с уроком 6, на котором мы рассматривали формат машинной команды микропроцессора и систему его команд в целом.
Выберите тему:
Знакомство с порядком описания команд и принятыми обозначениями
Описание команд микропроцессора, упорядоченное по алфавиту
Описание команд микропроцессора, упорядоченное по функциональному признаку
aaa | aad | aam | aas | adc | add | and |
bound | bsf | bsr | bswap | bt | btc | btr |
bts | call | cbw | cwde | clc | cld | cli |
cmc | cmp | cmps/cmpsb /cmpsw/cmpsd | cmpxchg | cwd | cdq | daa |
das | dec | div | enter | hlt | idiv | imul |
in | inc | ins/insb /insw/insd | int | into | iret/iretd | jcc |
jcxz | jecxz | jmp | lahf | lds | les | lfs |
lgs | lss | lea | leave | lgdt | lidt | lods/lodsb /lodsw/lodsd |
loop | loope | loopz | loopne | loopnz | mov | movs/movsb /movsw/movsd |
movsx | movzx | mul | neg | nop | not | or |
out | outs | pop | popa | popad | popf | popfd |
push | pusha | pushad | pushf | pushfd | rcl | rcr |
rep/repe/repz /repne/repnz | ret/retf | rol | ror | sahf | sal | sar |
sbb | scas/scasb /scasw/scasd | setcc | sgdt | sidt | shl | shld |
shr | shrd | stc | std | sti | stos/stosb /stosw/stosd | sub |
test | xadd | xchg | xlat/xlatb | xor |
Порядок описания команд будет следующим:
- название команды с расшифровкой ее мнемонического обозначения — это облегчит процесс запоминания и последующего использования команды в соответствии с ее функциональным назначением;
- синтаксическое описание команды, поясняющее возможные сочетания операндов для данной команды. При этом сложные синтаксические описания будут приведены в виде синтаксических диаграмм, что позволит в наиболее компактной форме изобразить все возможные сочетания операндов;
- состояние флагов после выполнения команды;
- описание типового применения команды с примером и (или) ссылка на урок, в котором демонстрируется пример применения команды;
- номера занятий и приложений, а также список команд, которые функционально связаны с данной командой.
Для описания команд приняты обозначения:
- Для описания состояния флагов после выполнения некоторой команды будем использовать выборку из таблицы, отражающей структуру регистра флагов eflags:
VM | RF | NT | IOPL | OF | DF | IF | TF | SF | ZF | AF | PF | CF | ||||||
- В нижней строке этой таблицы приводятся значения флагов после выполнения команды. При этом используются следующие обозначения:
- 1 — после выполнения команды флаг устанавливается (равен 1);
- 0 — после выполнения команды флаг сбрасывается (равен 0);
- r — значение флага зависит от результата работы команды;
- ? — после выполнения команды флаг не определен;
- пробел — после выполнения команды флаг не изменяется;
- Для представления операндов в синтаксических диаграммах используются следующие обозначения:
- r8, r16, r32 — операнд в одном из регистров размером байт, слово или двойное слово;
- m8, m16, m32, m48 — операнд в памяти размером байт, слово, двойное слово или 48 бит;
- i8, i16, i32 — непосредственный операнд размером байт, слово или двойное слово;
- a8, a16, a32 — относительный адрес (смещение) в сегменте кода.
- На многих диаграммах в целях компактности возможные сочетания операндов показаны в виде следующей конструкции:
Конструируя команду на основе подобной синтаксической диаграммы, вы должны помнить о соответствии типов. В подобной диаграмме допустимы только следующие сочетания: "r8, m8", "r16, m16", "r32, m32". Например, сочетание "r8, m16" недопустимо. Однако есть единичные случаи, когда подобные сочетания возможны; тогда они специально оговариваются.
- Описанная в данном приложении система команд в полном объеме поддерживается микропроцессором Pentium. Предыдущие модели микропроцессора могут не поддерживать отдельные команды. Чтобы прояснить этот момент, мы будем указывать в примерах для каждой команды директиву типа .286. Это будет означать, что описываемая команда поддерживается всеми моделями микропроцессора, начиная с i286. Если ничего не указывается, то это означает, что данная команда работает на всех моделях микропроцессоров Intel, начиная с i8086/8088.
AAA
(Ascii Adjust after Addition)
ASCII-коррекция после сложения
Схема команды: | aaa |
Назначение: корректировка неупакованного результата сложения двух одноразрядных неупакованных BCD-чисел.
Синтаксис
Алгоритм работы:
- проанализировать значение младшего полубайта регистра al и значение флага af;
- если (значение младшего полубайта регистра al >9) или (AF=1), то выполнить следующие действия:
- увеличить значение al на 6;
- очистить старший полубайт регистра al;
- увеличить значение ah на 1;
- установить флаги: af = 1, cf = 1,
иначе сбросить флаги af = 0 и cf = 0.
Состояние флагов после выполнения команды:
OF | SF | ZF | AF | PF | CF |
? | ? | ? | r | ? | r |
Применение:
Обычно команда aaa используется после сложения каждого разряда распакованных BCD-чисел командой add. Каждая цифра неупакованного BCD-числа занимает младший полубайт байта. Если результат сложения двух одноразрядных BCD-чисел больше 9, то число в младшем полубайте результата не есть BCD-число. Поэтому результат нужно корректировать командой aaa. Эта команда позволяет сформировать правильное BCD-число в младшем полубайте и запомнить единицу переноса в старший разряд путем увеличения содержимого регистра ah на 1.
К примеру, сложить два неупакованных BCD-числа: 08 + 05:
mov ah,08h ;ah=08h mov al,05h ;al=05h add al,ah ;al=al+ah=05h+08h=0dh — не BCD-число xor ah,ah ;ah=0 aaa ;ah=01h,al=03h — результат скорректирован |
См. также: урок 8, приложение 7 и команды aad, aam, aas, daa, das
AAD
(Ascii Adjust before Division)
ASCII-коррекция перед делением
Схема команды: | aad |
Назначение:
- подготовкa двух неупакованных BCD-чисел для операции деления;
- преобразование двузначного неупакованного ВCD-числа меньшего 63h (9910) в двоичное представление.
Синтаксис
Алгоритм работы:
- умножить значение регистра ah на 10 и сложить полученное значение с содержимым регистра al: (ah*10)+al;
- присвоить регистру al значение (ah*10)+al;
- обнулить регистр ah.
Состояние флагов после выполнения команды:
OF | SF | ZF | AF | PF | CF |
? | r | r | r | r | ? |
Применение:
Команду aad используют для подготовки двузначного неупакованного BCD-числа в регистре ax для операции деления. Так как в системе команд микропроцессора нет команды деления для BCD-чисел, такое число нужно предварительно преобразовать в двоичный вид. Для этого старший разряд двузначного BCD-числа помещается в регистр ah, умножается на 10 и складывается с разрядом единиц двузначного BCD-числа 9 в регистре al. В результате этих действий и получается соответствующее двоичное число в регистре ax. Далее в программе уже можно применять обычную команду деления div, оперирующую двоичными данными. Команду aad можно применять и просто для преобразования неупакованного двузначного BCD-числа в его двоичный эквивалент. Есть еще интересный момент — если посмотреть на коды символов шестнадцатеричных цифр в таблице ASCII, то видно, что они похожи на BCD-числа. Исключение составляет лишь значение старшей тетрады (для BCD-числа это так называемая зона с нулевым значением) - оно равно 3. Можно сделать вывод, что если предварительно обнулить значение старшей тетрады для кодов двух символов (от 0 до 9), то эту команду вполне можно применять и для преобразования двузначных десятичных чисел в символьном представлении в их двоичный эквивалент, что и отражено в названии команды. Для иллюстрации рассмотрим два примера.
Пример 1. Разделить десятичное число 18 на 9. Подготовить результат к выводу на экран.
mov ah,01h ;ah=01h mov al,08h ;al=08h => ax=0108h mov bl,09 ;bl=09h aаd ;al=12h — двоичный эквивалент десятичного числа 18 div bl ;al=02h,ah=00h ог al,30h ;al=32h — ASCII-представление числа 2, можно выводить на экран |
Пример 2. Преобразовать десятичное число 16 в символьном виде в эквивалентное двоичное число.
mov ax,3136h ;ax=3136h and ax,0f0fh ;ax=0106h aаd ;al=10h — получили его двоичный эквивалент |
См. также: уроки 3, 8, приложение 7 и команды aaa, aam, aas, daa, das
AAM
(Ascii Adjust after Multiply)
ASCII-коррекция после умножения
Схема команды: | aam |
Назначение:
- корректировка результата умножения двух неупакованных BCD-чисел;
- преобразование двоичного числа меньшего 63h (9910) в его неупакованный BCD-эквивалент.
Синтаксис
Алгоритм работы:
- разделить значение регистра al на 10;
- записать частное в регистр ah, остаток — в регистр al.
Состояние флагов после выполнения команды:
OF | SF | ZF | AF | PF | CF |
? | r | r | r | r | ? |
Применение:
Команду aam используют для коррекции результата умножения двух неупакованных BCD-чисел. Специальной команды умножения BCD-чисел нет. Поэтому BCD-числа умножаются поразрядно, как обычные двоичные числа, командой mul. Максимальное число, которое получается при таком умножении, — это 9*9=8110=5116. Отсюда понятно, что значения, для которых командой aam можно получить их двузначный BCD-эквивалент в регистре ax, находятся в дипазоне от 00h до 51h. Эту команду можно применять и для преобразования двоичного числа из регистра ax (в диапазоне от 0 до 63h) в его десятичный эквивалент(соответственно, из диапазона от 0 до 9910).
Пример 1. Умножить десятичное число 8 на 9. Подготовить результат к выводу на экран.
mov ah,08h ;ah=08h mov al,09h ;al= 09h mul ah ;al=48h — двоичный эквивалент 72 aam ;ah=07h,al=02h or ax,3030h ;ax=3732h — ASCII-представление числа 72 |
Пример 2. Преобразовать двоичное число 60h в эквивалентное десятичное число.
;поместим число 60h в регистр ax mov ax,60h ;ax=60h aаm ;ax=0906h — получили десятичный эквивалент числа 60h or ax,3030h ;символьный эквивалент, можно выводить на экран |
См. также: урок 8, приложение 7 и команды aaa, aad, aas, daa, das
AAS
(Ascii Adjust after Substraction)
ASCII-коррекция после вычитания
Схема команды: | aas |
Назначение: корректировка результата вычитания двух неупакованных одноразрядных BCD-чисел.
Синтаксис
Алгоритм работы:
если (младший полубайт регистра al меньше 9) или (флаг af=1), то выполнить следующие действия:
- уменьшить значение младшего полубайта регистра al на 6;
- обнулить значение старшего полубайта регистра al;
- установить флаги af и cf в 1;
иначе установить флаги af и cf в 1.
Состояние флагов после выполнения команды:
OF | SF | ZF | AF | PF | CF |
? | ? | ? | r | ? | r |
Применение:
Команду aas используют для коррекции результата вычитания двух неупакованных одноразрядных BCD-чисел после команды sub. Операндами в команде sub должны быть правильные одноразрядные BCD-числа. Рассмотрим возможные варианты вычитания одноразрядных BCD-чисел:
- 5-9 — для вычитания необходимо сделать заем в старшем разряде. Факт такого заема в микропроцессоре фиксируется установкой флагов cf и af в 1 и вычитанием 1 из содержимого ah. В результате после команды aas в регистре al получается правильное значение (модуль результата), которое для нашего примера (с учетом заема из старшего разряда) составляет 6. Одновременно моделируется заем из старшего разряда, что позволяет производить вычитание длинных чисел.
- 8-6 — для вычитания нет необходимости делать заем в старшем разряде. Поэтому производится сброс флагов cf и af в 0, а ah не изменяется. В результате после команды aas в регистре al получается правильное значение (модуль результата), которое для нашего примера составляет 2.
Пример 1. Вычесть десятичное число 8 из 5. Подготовить результат к выводу на экран.
mov al,05h mov bl,08h sub al,bl ;al=0fdh aas ;al=07, cf=af=1 or al,30h ;al=37h — код символа 7;вывод результата на экран mov ah,2 mov dl,al int 21h |
См. также: уроки 3, 8, приложение 7 и команды aaa, aad, aam, daa, das
ADC
(Addition with Carry)
Сложение с переносом
Схема команды: | adc приемник,источник |
Назначение: сложение двух операндов с учетом переноса из младшего разряда.
Синтаксис
Алгоритм работы:
- сложить два операнда;
- поместить результат в первый операнд: приемник=приемник+источник;
- в зависимости от результата установить флаги.
Состояние флагов после выполнения команды:
OF | SF | ZF | AF | PF | CF |
r | r | r | r | r | r |
Применение:
Команда adc используется при сложении длинных двоичных чисел. Ее можно использовать как самостоятельно, так и совместно с командой add. При совместном использовании команды adc с командой add сложение младших байтов/слов/двойных слов осуществляется командой add, а уже старшие байты/слова/двойные слова складываются командой adc, учитывающей переносы из младших разрядов в старшие. Таким образом, команда adc значительно расширяет диапазон значений складываемых чисел. В приложении 7 приведен пример программы сложения двоичных чисел произвольной размерности.
.datasl1 dd 01fe544fhsl2 dd 005044cdhelderREZ db 0 ;для учета переноса из старшего разряда результатаrez dd 0.code... mov ax,sl1 add ax,sl2 ;сложение младших слов слагаемых mov rez,ax mov ax,sl+2 adc ax,sl2+2 ;сложение старших слов слагаемых плюс cf mov rez+2,ax adc elderREZ,0 ;учесть возможный перенос |
См. также: урок 8, приложение 7 и команды add, sub, sbb, xadd
ADD
(ADDition)
Сложение
Схема команды: | add приемник,источник |
Назначение: сложение двух операндов источник и приемник размерностью байт, слово или двойное слово.
Синтаксис
Алгоритм работы:
- сложить операнды источник и приемник;
- записать результат сложения в приемник;
- установить флаги.
Состояние флагов после выполнения команды:
OF | SF | ZF | AF | PF | CF |
r | r | r | r | r | r |
Применение:
Команда add используется для сложения двух целочисленных операндов. Результат сложения помещается по адресу первого операнда. Если результат сложения выходит за границы операнда приемник (возникает переполнение), то учесть эту ситуацию следует путем анализа флага cf и последующего возможного применения команды adc. Например, сложим значения в регистре ax и области памяти ch. При сложении следует учесть возможность переполнения.
chiclo dw 2015rez dd 0... add ax,chislo ;(ax)=(ax)+ch mov word ptr rez,ax jnc dop_sum ;переход, если результат не вышел за разрядную сетку adc word ptr rez+2,0 ;расширить результат, для учета переноса ;в старший разрядdop_sum:... |
См. также: урок 8, Приложение 7 и команды adc, sub, sbb, xadd
AND
(logical AND)
Логическое И
Схема команды: | and приемник,источник |
Назначение: операция логического умножения для операндов приемник и источник размерностью байт, слово или двойное слово.
Синтаксис
Алгоритм работы:
- выполнить операцию логического умножения над операндами источник и приемник: каждый бит результата равен 1, если соответствующие биты операндов равны 1, в остальных случаях бит результата равен 0;
- записать результат операции в приемник;
- установить флаги.
Состояние флагов после выполнения команды:
OF | SF | ZF | PF | CF |
r | r | r |
Применение:
Команда and используется для логического умножения двух операндов. Результат операции помещается по адресу первого операнда. Эту команду удобно использовать для принудительной установки или сброса определенных битов операнда.
Например, преобразуем двузначное упакованное BCD-число в его символьный эквивалент.
u_BCD db 25h ;упакованное BCD-числоs_ch dw 0 ;место для результата... xor ax,ax ;очистка ax mov al,u_BCD shl ax,4 ;ax=0250 mov al,u_BCD ;ax=0225;преобразование в символьное представление: and ax,3f3fh ;ax=3235h mov s_ch,ax |
См. также: уроки 9, 12 и команды or, xor, test
BOUND
(check array BOUNDs)
Контроль нахождения индекса массива в границах
Схема команды: | bound индекс,границы массива |
Назначение: проверка нахождения значения индекса в границах массива.
Синтаксис
Алгоритм работы:
Cравнить значение в регистре индекс с двумя значениями, расположенными последовательно в ячейке памяти, адресуемой операндом границы массива. Диапазон значений индекса определяется используемым регистром индекс:
- если это 16-разрядный регистр общего назначения, то содержащееся в нем значение проверяется на попадание в диапазон значений, которые находятся в двух последовательных словах в памяти по адресу, указываемому вторым операндом. Эти два значения являются, соответственно, значениями нижнего и верхнего индекса границы массива;
- если это 32-разрядный регистр общего назначения, то содержащееся в нем значение проверяется на попадание в диапазон значений, которые находятся в двух последовательных двойных словах в памяти по адресу, указываемому вторым операндом. Эти два значения являются, соответственно, значениями нижнего и верхнего индекса границы массива;
Если в результате проверки значение из регистра вышло за пределы указанного диапазона значений, то возбуждается прерывание с номером 5, если нет, программа продолжает выполнение.
Состояние флагов после выполнения команды:
выполнение команды не влияет на флаги |
Применение:
Команду bound очень удобно использовать для контроля выхода за нижнюю или верхнюю границы массива. Значения этих границ должны быть предварительно помещены в два последовательных слова (двойных слова) в памяти. Адрес этих слов (двойных слов) указывается вторым операндом. Далее динамически в ходе работы программы значение в регистре индекс, указываемом первым операндом, сравнивается со значениями этих двух границ, и если нижняя_граница<=(индексindex)<=верхняя_граница, то программа продолжает выполнение. В противном случае генерируется исключительная ситуация 5 (int 5). Далее в программе обработки этой ситуации можно выполнить необходимую корректировку и вернуться в программу (см. урок 17).
Фрагмент, который можно использовать при обработке одномерного массива с размерностью элементов в слово:
.286 ;это обязательная директива, так как bound ;входит в систему команд микропроцессоров, начиная с i286.dataBoundMas label wordLow_Bound dw 0Upp_Bound dw 20mas dw 10 dup (?)... xor di,di ;очистка индексного регистраcycl: mov ax,mas[di] ;переборэлементов массива add di,2 bound di,BoundMas;если значение в di не будет попадать в границы, то будет вызван;обработчик прерывания 5, где можно скорректировать;значение ip/eip в стеке с тем, чтобы выйти;из бесконечного ;цикла, например, на метку М2 или;выполнить другие действия jmp cyclМ2:... |
См. также: урок 17 и команду iret/iretd
BSF
(Bit Scan Forward)
Побитное сканирование вперед
Схема команды: | bsf результат,источник |
Назначение: для проверки наличия единичных битов в операнде источник.
Синтаксис
Алгоритм работы:
- просмотр битов операнда источник, начиная с бита 0 и заканчивая битом 15/31, до тех пор, пока не встретится единичный бит;
- если встретился единичный бит, то флаг zf устанавливается в 0 и в регистр первого операнда записывается номер позиции, где встретился единичный бит. Диапазон значений зависит от разрядности второго операнда: для 16-разрядного операнда — это 0...15; для 32-разрядного — это 0...31;
- если единичных битов нет, то флаг zf устанавливается в 1.
Состояние флагов после выполнения команды:
ZF |
r |
Применение:
Команду bsf используют при работе на битном уровне для определения позиции в операнде крайних справа единичных битов.
Например, сдвинем содержимое регистра bx вправо таким образом, чтобы нулевой бит стал единичным:
.386 mov bx,0002h ;bx=0000 0010b... bsf cx,bx ;cx=0001h jz null shr bx,cl ;bx=0000 0001b...null: |
См. также: урок 9, 12 и команду bsr
BSR
(Bit Scan Reverse)
Побитное сканирование назад
Схема команды: | bsr результат,источник |
Назначение: проверка наличия единичных битов в операнде источник.
Синтаксис
Алгоритм работы:
- просмотр битов операнда источник, начиная со старшего бита 15/31 и заканчивая битом 0, до тех пор, пока не встретится единичный бит;
- если встретился единичный бит, флаг zf устанавливается в 0 и в регистр первого операнда записывается номер позиции (отсчет осуществляется относительно нулевой позиции), где встретился самый старший единичный бит. Диапазон значений зависит от разрядности второго операнда: для 16-разрядного операнда это 0...15; для 32-разрядного — 0...31;
- если единичных битов нет, флаг zf устанавливается в 1.
Состояние флагов после выполнения команды:
ZF |
r |
Применение:
Команду bsr используют при работе на битном уровне для определения позиции крайних слева единичных битов.
Например, сдвинем содержимое регистра bx вправо таким образом, чтобы старший единичный бит исходного значения в bx переместился в нулевую позицию:
.386 mov bx,41h... bsr cx,bx ;cx=06h jz null shr bx,ax ;bx=0001h...null:... |
См. также: уроки 9, 12 и команду bsf
BSWAP
(Byte SWAP)
Перестановка байтов
Схема команды: | bswap источник |
Назначение:
- изменение порядка следования байтов;
- переход от одной формы адресации к другой.
Под формой адресации здесь понимается принцип "младший байт по младшему адресу" или обратный ему. Существует ряд систем, например использующих микропроцессоры Motorola или большие ЭВМ, где применяется принцип размещения многобайтовых значений обратный тому, который используется в микропроцессорах Intel. Поэтому эту команду можно использовать для разработки программ-конверторов между подобными платформами и IBM РС.
Синтаксис
Алгоритм работы: Схема алгоритма
Состояние флагов после выполнения команды:
выполнение команды не влияет на флаги |
Применение:
Команду bswap используют для изменения формы адресации. В качестве операнда может быть указан только 32-разрядный регистр. Эта команда используется в моделях микропроцессоров, начиная с i486.
.486 mov ebx,1a2c345fhh bswap ebx ;ebx=5f342c1ah |
См. также: урок 7, и команду xchg
BT
(Bit Test)
Проверка битов
Схема команды: | bt источник,индекс |
Назначение: извлечение значения заданного бита в флаг cf.
Синтаксис
Алгоритм работы:
- получить бит по указанному номеру позиции в операнде источник;
- установить флаг cf согласно значению этого бита.
Состояние флагов после выполнения команды:
CF |
r |
Применение:
Команду bt используют для определения значения конкретного бита в операнде источник. Номер проверяемого бита задается содержимым второго операнда (значение числом из диапазона 0...31). После выполнения команды, флаг cf устанавливается в соответствии со значением проверяемого бита.
.386 mov ebx,01001100h bt ebx,8 ;проверка состояния бита 8 и установка cf= в 1 jc m1 ;перейти на m1, если проверяемый бит равен 1... |
См. также: уроки 9, 12 и команды btc, btr, bts, test
BTC
(Bit Test and Complement)
Проверка бита с инверсией (дополнением)
Схема команды: | btc источник,индекс |
Назначение: извлечение значения заданного бита в флаг cf и изменение его значения в операнде на обратное.
Синтаксис
Алгоритм работы:
- получить значение бита с номером позиции индекс в операнде источник;
- инвертировать значение выбранного бита в операнде источник;
- установить флаг сf исходным значением бита.
Состояние флагов после выполнения команды:
CF |
r |
Применение:
Команда btс используется для определения и инвертирования значения конкретного бита в операнде источник. Номер проверяемого бита задается содержимым второго операнда индекс (значение из диапазона 0...31). После выполнения команды флаг cf устанавливается в соответствии с исходным значением бита, то есть тем, которое было до выполнения команды.
.386 mov ebx,01001100h;проверка состояния бита 8 и его обращение: btc ebx,8 ;cf=1 и ebx=01001000h |
См. также: уроки 9, 12 и команды bt, btr, bts, test
BTR
(Bit Test and Reset)
Проверка бита с его сбросом в 0
Схема команды: | btr источник,индекс |
Назначение: извлечение значения заданного бита в флаг cf и изменение его значения на нулевое.
Синтаксис
Алгоритм работы:
- получить значение бита с указанным номером позиции в операнде источник;
- установить флаг cf значением выбранного бита;
- установить значение исходного бита в операнде в 0.
Состояние флагов после выполнения команды:
CF |
r |
Применение:
Команда btr используется для определения значения конкретного бита в операнде источник и его сброса в 0. Номер проверяемого бита задается содержимым второго операнда индекс (значение из диапазона 0...31). В результате выполнения команды флаг cf устанавливается в соответствии со значением исходного бита, то есть тем, что было до выполнения операции.
.386 mov ebx,01001100h;проверка состояния бита 8 и его сброс в 0 btr ebx,8 ;cf=1 и ebx=01001000h |
См. также: уроки 9, 12 и команды bt, btc, bts, test
BTS
(Bit Test and Set)
Проверка бита с его установкой в 1
Схема команды: | bts источник,индекс |
Назначение: извлечение значения заданного бита операнда в флаг cf и установка этого бита в единицу.
Синтаксис
Алгоритм работы:
- получить значение бита с указанным номером позиции в операнде источник;
- установить флаг cf значением выбранного бита;
- установить значение исходного бита в операнде источник в 1.
Состояние флагов после выполнения команды:
CF |
r |
Применение:
Команда bts используется для определения значения конкретного бита в операнде источник и установки проверяемого бита в 1. Номер проверяемого бита задается содержимым второго операнда индекс (значение из диапазона 0...31). После выполнения команды флаг cf устанавливается в соответствии со значением исходного бита, то есть тем, что было до выполнения операции.
.386 mov ebx,01001100h;проверка состояния бита 0 и его установка в 1 bts ebx,0 ;cf=0 ebx=01001001h |
См. также: уроки 9, 12 и команды bt, btc, btr, test
CALL
(CALL)
Вызов процедуры или задачи
Схема команды: | call цель |
Назначение:
- передача управления близкой или дальней процедуре с запоминанием в стеке адреса точки возврата;
- переключение задач.
Синтаксис
Алгоритм работы:
определяется типом операнда:
- метка ближняя — в стек заносится содержимое указателя команд eip/ip и в этот же регистр загружается новое значение адреса, соответствующее метке;
- метка дальняя — в стек заносится содержимое указателя команд eip/ip и cs. Затем в эти же регистры загружаются новые значения адресов, соответствующие дальней метке;
- r16, 32 или m16, 32 — определяют регистр или ячейку памяти, содержащие смещения в текущем сегменте команд, куда передается управление. При передаче управления в стек заносится содержимое указателя команд eip/ip;
- указатель на память — определяет ячейку памяти, содержащую 4 или 6-байтный указатель на вызываемую процедуру. Структура такого указателя 2+2 или 2+4 байта. Интерпретация такого указателя зависит от режима работы микропроцессора:
- в реальном режиме — в зависимости от размера адреса (use16 или use32) первые два байта трактуются как сегментный адрес, вторые два/четыре байта, как смещение целевой метки передачи управления. В стеке запоминается содержимое регистров cs и eip/ip;
- в защищенном режиме — интерпретация цели передачи управления зависит от значения байта AR дескриптора, определяемого селекторной частью указателя. Целью здесь являются дальний вызов процедуры без изменения уровня привилегий, дальний вызов процедуры с изменением уровня привилегий или переключение задачи.
Состояние флагов после выполнения команды (кроме переключения задачи):
выполнение команды не влияет на флаги |
При переключении задачи значения флажков изменяются в соответствии с информацией о регистре eflags в сегменте состояния TSS задачи, на которую производится переключение.
Применение:
Как видно из описания алгоритма, команда call позволяет организовать гибкую и многовариантную передачу управления на подпрограмму с сохранением адреса точки возврата. Подробно типовые примеры использования рассмотрены на уроках 10 и 14.
См. также: уроки 10, 14 и команду ret
CBW/CWDE
(Convert Byte to Word/Convert Word to Double Word Extended)
Преобразование байта в слово/слова в двойное слово
Схема команды: | cbw cwde |
Назначение: расширение операнда со знаком.
Синтаксис
Алгоритм работы:
cbw — при работе команда использует только регистры al и ax:
- анализ знакового бита регистра al:
- если знаковый бит al=0, то ah=00h;
- если знаковый бит al=1, то ah=0ffh.
cwde — при работе команда использует только регистры ax и eax:
- анализ знакового бита регистра ax:
- если знаковый бит ax=0, то установить старшее слово eax=0000h;
- если знаковый бит ax=1, то установить старшее слово eax=0ffffh.
Состояние флагов после выполнения команды:
выполнение команды не влияет на флаги |
Применение:
Данные команды используются для приведения операндов к нужной размерности с учетом знака. Такая необходимость может, в частности, возникнуть при программировании арифметических операций.
.386 ;только для cwde, cwd была для i8086 mov ebx,10fecd23h mov ax,-3 ;ax=1111 1111 1111 1101 cwde ;eax=1111 1111 1111 1111 1111 1111 1111 1101 add eax,ebx |
См. также: урок 8 и команды cdq, cwd
CLC
(CLear Carry flag)
Сброс флага переноса
Схема команды: | clc |
Назначение: сброс флага переноса cf.
Синтаксис
Алгоритм работы:
установка флага cf в ноль.
Состояние флагов после выполнения команды:
CF |
Применение:
Данная команда используется для сброса флага cf в ноль. Такая необходимость может возникнуть при работе с командами сдвига, арифметическими командами либо действиями по индикации обнаружения ошибок и различных ситуаций в программе.
clc ;cf=0 |
См. также: уроки 8, 9 и команды cmc, stc
CLD
(CLear Direction flag)
Сброс флага направления
Схема команды: | cld |
Назначение: сброс в ноль флага направления df.
Синтаксис
Алгоритм работы:
установка флага df в ноль.
Состояние флагов после выполнения команды:
DF |
Применение:
Данная команда используется для сброса флага df в ноль. Такая необходимость может возникнуть при работе с цепочечными командами. Нулевое занчение флага df вынуждает микропроцессор при выполнении цепочечных операций производить инкремент регистров si и di.
cld ;df=0 |
См. также: урок 11 и команды stc, movs/movsb/movsw/movsd,
cmps/cmpsb/cmpsw/cmpsd, scas/scasb/scasw/scasd,
lods/lodsb/lodsw/lodsd, stos/stosb/stosw/stosd,
ins/insb/insw/insd, outs
CLI
(CLear Interrupt flag)
Сброс флага прерывания
Схема команды: | cli |
Назначение: сброс флага прерывания if.
Синтаксис
Алгоритм работы:
установка флага if в ноль.
Состояние флагов после выполнения команды:
IF |
Применение:
Данная команда используется для сброса флага if в ноль. Такая необходимость может возникнуть при разработке программ обработки прерываний.
cli ;if=0 |
См. также: урок 15 и команды int, iret/iretd, sti
CMC
(CoMplement Carry flag)
Инвертирование флага переноса
Схема команды: | cmc |
Назначение: изменение значения флага переноса cf на обратное.
Синтаксис
Алгоритм работы:
инвертирование значения флага переноса cf.
Состояние флагов после выполнения команды: