Знакомство с порядком описания команд и принятыми обозначениями 3 страница



выполнение команды не влияет на флаги

Применение:

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

.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 в ноль.

Состояние флагов после выполнения команды:

00
CF
0

Применение:

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

clc ;cf=0

См. также: уроки 8, 9 и команды cmc, stc

CLD

(CLear Direction flag)

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

 

Схема команды: cld

Назначение: сброс в ноль флага направления df.

Синтаксис

Алгоритм работы:

установка флага df в ноль.

Состояние флагов после выполнения команды:

10
DF
0

Применение:

Данная команда используется для сброса флага 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 в ноль.

Состояние флагов после выполнения команды:

09
IF
0

Применение:

Данная команда используется для сброса флага if в ноль. Такая необходимость может возникнуть при разработке программ обработки прерываний.

cli ;if=0

См. также: урок 15 и команды int, iret/iretd, sti

CMC

(CoMplement Carry flag)

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

 

Схема команды: cmc

Назначение: изменение значения флага переноса cf на обратное.

Синтаксис

Алгоритм работы:

инвертирование значения флага переноса cf.

Состояние флагов после выполнения команды:

00
CF
r

Применение:

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

proc1 proc... cmc...proc1 endp... call proc1 jc m1 ;если cf=1, то переход на m1...m1:...

См. также: уроки 8, 9, 15 и команды clc, stc, jc, jnc

CMP

(CoMPare operands)

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

 

Схема команды: cmp операнд1,операнд2

Назначение: сравнение двух операндов.

Синтаксис

Алгоритм работы:

  • выполнить вычитание (операнд1-операнд2);
  • в зависимости от результата установить флаги, операнд1 и операнд2 не изменять (то есть результат не запоминать).

Состояние флагов после выполнения команды:

11 07 06 04 02 00
OF SF ZF AF PF CF
r r r r r r

Применение:

Данная команда используется для сравнения двух операндов методом вычитания, при этом операнды не изменяются. По результатам выполнения команды устанавливаются флаги. Команда cmp применяется с командами условного перехода и командой установки байта по значению setcc.

len equ 10... cmp ax,len jne m1 ;переход если (ax)<>len jmp m2 ;переход если (ax)=len

См. также: уроки 10, 11, 12 и команды cmps/cmpsb/cmpsw/cmpsd, cmpxchg, sub, jcc, setcc

CMPS/CMPSB/CMPSW/CMPSD

(CoMPare String Byte/Word/Double word operands)

Сравнение строк байтов/слов/двойных слов

 

Схема команды: cmps приемник,источник cmpsb cmpsw cmpsd

Назначение: сравнение двух последовательностей (цепочек) элементов в памяти.

Синтаксис

Алгоритм работы:

  • выполнить вычитание элементов (источник - приемник), адреса элементов предварительно должны быть загружены:
    • адрес источника — в пару регистров ds:esi/si;
    • адрес назначения — в пару регистров es:edi/di;
  • в зависимости от состояния флага df изменить значение регистров esi/si и edi/di:
    • если df=0, то увеличить содержимое этих регистров на длину элемента последовательности;
    • если df=1, то уменьшить содержимое этих регистров на длину элемента последовательности;
  • в зависимости от результата вычитания установить флаги:
    • если очередные элементы цепочек не равны, то cf=1, zf=0;
    • если очередные элементы цепочек или цепочки в целом равны, то cf=0, zf=1;
  • при наличии префикса выполнить определяемые им действия (см. команды repe/repne).

Состояние флагов после выполнения команды:

11 07 06 04 02 00
OF SF ZF AF PF CF
r r r r r r

Применение:

Команды без префиксов осуществляют простое сравнение двух элементов в памяти. Размеры сравниваемых элементов зависят от применяемой команды. Команда cmps может работать с элементами размером в байт, слово, двойное слово. В качестве операндов в команде указываются идентификаторы последовательностей этих элементов в памяти. Реально эти идентификаторы используются лишь для получения типов элементов последовательностей, а их адреса должны быть предварительно загружены в указанные выше пары регистров. Транслятор, обработав команду cmps и выяснив тип операндов, генерирует одну из машинных команд cmpsb, cmpsw или cmpsd. Машинного аналога для команды cmps нет. Для адресации назначения обязательно должен использоваться регистр es, а для адресации источника можно делать замену сегмента с использованием соответствующего префикса.

Для того чтобы эти команды можно было использовать для сравнения последовательности элементов, имеющих размерность байт, слово, двойное слово, необходимо использовать один из префиксов repe или repne. Префикс repe заставляет циклически выполняться команды сравнения до тех пор, пока содержимое регистра ecx/cx не станет равным нулю или пока не совпадут очередные сравниваемые элементы цепочек (флаг zf=1). Префикс repne заставляет циклически производить сравнение до тех пор, пока не будет достигнут конец цепочки (ecx/cx=0) либо не встретятся различающиеся элементы цепочек (флаг zf=0).

.dataobl1 db 'Строка для сравнения'obl1 db 'Строка для сравнения'a_obl1 dd obl1a_obl2 dd obl2.code... cld ;просмотр цепочки в направлении возрастания адресов mov cx,20 ;длина цепочки lds si,a_obl1 ;адрес источника в пару ds:si les di,a_obl2 ;адрес назначения в пару ds:sirepe cmpsb ;сравнивать, пока равны jnz m1 ;если не конец цепочки, то встретились разные элементы... ;действия, если цепочки совпали...m1:... ;действия, если цепочки не совпали

См . также : уроки 10, 11 и команды ins, lods, movs, outs, scas, stos, repe, repz, repne, repnz

CMPXCHG

(CoMPare and eXCHanGe)

Сравнение и обмен

 

Схема команды: cmpxchg приемник,источник(аккумулятор)

Назначение: сравнение и обмен значений между источником и приемником.

Синтаксис

Алгоритм работы:

  • выполнить сравнение элементов источник и приемник;
  • если источник и приемник не равны, то:
    • установить zf=0;
    • переслать содержимое операнда приемник в источник (регистр al/ax/eax).
  • если источник и приемник равны, то:
    • установить zf=1;
    • переслать содержимое операнда источник (регистр al/ax/eax) по месту операнда приемник.

Состояние флагов после выполнения команды:

11 07 06 04 02 00
OF SF ZF AF PF CF
r r r r r r

Применение:

Команды сравнивают два операнда. Один из сравниваемых операндов находится в аккумуляторе (регистре al/ax/eax), другой может находиться в памяти или регистре общего назначения. Если значения равны, то производится замена содержимого операнда приемник содержимым источника, находящимся в регистре-аккумуляторе. Если значения не равны, то производится замена содержимого операнда источника находящимся в регистре-аккумуляторе содержимым операнда назначения. Определить тот факт, была ли произведена смена значения в аккумуляторе (то есть были ли не равны сравниваемые операнды), можно по значению флага zf.

.486 mov ax,114eh mov bx,8e70h cmpxchg bx,ax jz m1 ;переход, если zf=1, то есть операнды равны ;и ax не изменился... ;действия, если операнды не равныm1:

См. также: уроки 7, 10 и команды cmp, xchg

CWD

(Convert Word to Double word)

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

 

Схема команды: cwd

Назначение: расширение слова со знаком до размера двойного слова со знаком.

Синтаксис

Алгоритм работы:

копирование значения старшего бита регистра ax во все биты регистра dx. Состояние флагов после выполнения команды:

выполнение команды не влияет на флаги

Применение:

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

mov ax,25... mov bx,4 cwd div bx

См . также : урок 8 и команды cbw, cdq, cwde, div, idiv, mul, imul, add, adc, sub, sbb

CDQ

(Convert Double word to Quad word)

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

 

Схема команды: cdq

Назначение: расширение двойного слова со знаком до размера учетверенного слова (64 бита) со знаком.

Синтаксис

Алгоритм работы:

копирование значения старшего бита регистра eax на все биты регистра edx. Состояние флагов после выполнения команды:

выполнение команды не влияет на флаги

Применение:

Команду cdq можно использовать для распространения значения знакового бита в регистре eax на все биты регистра edx. Данную операцию, в частности, можно использовать для подготовки к операции деления, для которой размер делимого должен быть в два раза больше размера делителя.

.386delimoe dd ...delitel dd ...... mov eax,delimoe cdq idiv delitel ;частное в eax, остаток в edx

См. также: урок 8 и команды cbw, cwd, cwde, div, idiv

DAA

(Decimal Adjust for Addition)

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

 

Схема команды: daa

Назначение: коррекция упакованного результата сложения двух BCD-чисел в упакованном формате.

Синтаксис

Алгоритм работы:

команда работает только с регистром al и анализирует наличие следующих ситуаций:

  • Ситуация 1. В результате предыдущей команды сложения флаг af=1 или значение младшей тетрады регистра al>9. Напомним, что флаг af устанавливается в 1 в случае переноса двоичной единицы из бита 3 младшей тетрады в старшую тетраду регистра al (если значение превысило 0fh). Наличие одного из этих двух признаков говорит о том, что значение младшей тетрады превысило 9h.
  • Ситуация 2. В результате предыдущей команды сложения флаг сf=1 или значение регистра al>9fh. Напомним, что флаг cf устанавливается в 1 в случае переноса двоичной единицы в старший бит операнда (если значение превысило 0ffh в случае регистра al). Наличие одного из этих двух признаков говорит о том, что значение в регистре al превысило 9fh.

Если имеет место одна из этих двух ситуаций, то регистр al корректируется следующим образом:

  • для ситуации 1 содержимое регистра al увеличивается на 6;
  • для ситуации 2 содержимое регистра al увеличивается на 60h;
  • если имеют место обе ситуации, то корректировка начинается с младшей тетрады.

Состояние флагов после выполнения команды (в случае, если были переносы):

11 07 06 04 02 00
OF SF ZF AF PF CF
r r r 1 r 1

Состояние флагов после выполнения команды (в случае, если переносов не было):

11 07 06 04 02 00
OF SF ZF AF PF CF
r r r 0 r 0

Применение:

Эту команду следует применять после сложения двух упакованных BCD-чисел с целью корректировки получающегося двоичного результата сложения в правильное двузначное десятичное число. После команды daa следует анализировать состояние флага cf. Если он равен 1, то это говорит о том, что был перенос единицы в старший разряд и это нужно учесть для сложения старших десятичных цифр BCD-числа.

mov al,69h ;69h — упакованное BCD-число mov bl,74h ;74h — упакованное BCD-число adc al,bl ;al=0ddh daa ;cf=1, al=43h;если перенос, то переход на ту ветвь программы,;где он будет учтен: jc m1

См. также: урок 8, Приложение 7 и команды aaa, aad, aam, aas, das

DAS

(Decimal Adjust for Subtraction)

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

 

Схема команды: das

Назначение: коррекция упакованного результата вычитания двух BCD-чисел в упакованном формате.

Синтаксис

Алгоритм работы:

команда das работает только с регистром al и анализирует наличие следующих ситуаций:

  • Ситуация 1. В результате предыдущей команды сложения флаг af =1 или значение младшей тетрады регистра al>9. Напомним, что для случая вычитания флаг af устанавливается в 1 в случае заема двоичной единицы из старшей тетрады в младшую тетраду регистра al. Наличие одного из этих двух признаков говорит о том, что значение младшей тетрады превысило 9h и его нужно корректировать.
  • Ситуация 2. В результате предыдущей команды сложения флаг сf =1 или значение регистра al>9fh. Напомним, что для случая вычитания флаг cf устанавливается в 1 в случае заема двоичной единицы. Наличие одного из этих двух признаков говорит о том, что значение в регистре al превысило 9fh.

Если имеет место одна из этих ситуаций, то регистр al корректируется следующим образом:

  • для ситуации 1 содержимое регистра al уменьшается на 6;
  • для ситуации 2 содержимое регистра al уменьшается на 60h;
  • если имеют место обе ситуации, то корректировка начинается с младшей тетрады.

Состояние флагов после выполнения команды (в случае, если были переносы):

11 07 06 04 02 00
OF SF ZF AF PF CF
r r r 1 r 1

Состояние флагов после выполнения команды (в случае, если переносов не было):


Дата добавления: 2019-09-13; просмотров: 233; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!