Сапа
Здесь может быть ваша реклама
|

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

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

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

Ниже приводится алфавитный перечень команд процессоров Intel с кратким описанием действия каждой команды и примерами ее использования.
В разделах статей, начинающихся с обозначения 386+, описываются отличия действия рассматриваемой команды в современных 32-разрядных процессорах (80386, i486, Pentium). Как правило, эти отличия заключаются в возможности использования не только 8- и 16-разрядных, но и 32-разрядных операндов, а также расширенных режимов адресации памяти. Обычные 16-разрядные программы реального режима вполне могут использовать расширенные регистры процессора (ЕАХ, ЕВХ и проч.), 32-битовые ячейки памяти и варианты команд для их обработки. Для того, чтобы ассемблер правильно транслировал команды с 32-разрядными операндами, в программу необходимо включить директиву ассемблера .386 (можно также использовать директивы .486 или .586), а сегменту команд (и во многих случаях сегменту данных) придать описатель use 16:


.386

codes segment use 16

assume CS:codes

codes ends

data segment use16

data ends


Кроме этого, необходимо разрешить компоновщику обрабатывать 32-разрядные операнды, что для компоновщика TLINK осуществляется указанием ключа /3.
Отдельные статьи, начинающиеся с обозначений 386+ , 486+ и Pentium+, посвящены командам, отсутствующим в МП 86. Многие из этих команд (например, команды проверки бита Ы или условной установки байта set) носят прикладной характер и могут использоваться в обычных программах реального режима.
Новые команды, реализованные впервые в МП 80386, сохраняют свое значение и в более современных процессорах. Для того, чтобы ассемблер распознавая команды МП 80386, в программе должна присутствовать директива .386.
Новые команды, реализованные впервые в МП 80486, сохраняют свое значение и в процессорах Pentium. Для того, чтобы ассемблер распознавая команды МП 80486, в программе должна присутствовать директива .486.
Для того, чтобы ассемблер распознавал команды, реализованные впервые в процессоре Pentium, в программе должна присутствовать директива .586.
Ряд команд требует для своего выполнения специальных условий, обычно отсутствующих в приложениях MS-DOS. Так, например, команда bound (проверки индекса массива на выход за границы) при обнаружении выхода за границы генерирует прерывание с вектором 5. Это прерывание в защищенном режиме как раз и является исключением нарушения границ массива, но в приложениях MS-DOS используется для вывода на печать содержимого экрана. Поэтому использование таких команд в реальном режиме затруднено.
Отдельные статьи, начинающиеся с обозначения 386Р+, посвящены привилегированным командам современных процессоров, работающих в расширенном режиме, и отсутствующим в МП 86. Для использования этих команд в программу необходимо включить директиву ассемблера .386Р (можно также использовать директивы .486Р или .586Р). Если при этом программа реализуется, как 16-разрядное приложение MS-DOS, сегмент команд должен иметь описатель usc16 (при наличии директивы .386 транслятор по умолчанию создает 32-разрядное приложение). Следует, однако, иметь в виду, что привилегированные команды защищенного режима предназначены для использования не в прикладных программах, а в операционных системах защищенного режима. В прикладных программах привилегированные команды приходится использовать лишь в весьма специальных случаях, когда, например, прикладная программа запускается в реальном режиме под управлением MS-DOS, но затем переводит процессор в защищенный режим и далее использует преимущества этого режима. Типичный пример программы такого рода - приложение DOS, которому требуется использовать всю оперативную память компьютера. В настоящей книге, посвященной, в основном, реальному режиму, дается лишь перечисление привилегированных команд защищенного режима.

ААА ASCII-коррекция регистра АХ после сложения

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

Пример


mov AX,0605h ; Неупакованное BCD 65

add AL,09h ;Неупакованное BCD 9, AX=060Eh

ааа ;AX=0704h, неупакованное BCD 74

AAD ASCII-коррекция регистра АХ перед делением


Команда aad используется перед операцией деления неупакованного двоично-десятичного (BCD) числа в регистре АХ на другое неупакован
ное двоично-десятичное число. Команда не имеет параметров. Она преобразует делимое в регистре АХ в двоичное число без знака, чтобы в результате деления получились правильные неупакованные двоично-десятичные числа (частное в AL, остаток в АН). Команда воздействует на флаги SF, ZF и PF.

Пример


raov AX,0207h ;Неупакованное BCD 27

mov DL,06h ;Неупакованное BCD 6

aad ;AX=001Bh=27

div DL ;AX=0304h, т.е. 4 и З в остатке

AAM ASCII-коррекция регистра АХ после умножения


Команда aam используется вслед за операцией умножения двух неупакованных двоично-десятичных чисел. Команда не имеет параметров. Она преобразует результат умножения, являющийся двоичным числом, в правильное неупакованное двоично-десятичное (BCD) число, младший разряд которого помещается в AL, а старший - в АН. Команда воздействует на флаги SF, ZF и PF.

Пример


mov AL,08h ;Неупакованное BCD 8

mov CL,07h ;Неупакованное BCD 7

mul CL ;AX=0038h=56

aam ;AX=0506h, BCD 56

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


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


Пример


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

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

sub AL,CL ;AX=07FFh

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

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

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

Пример 1


mov AX,1125h

adc AX,2C25h ;AX=3D4Bh, если CF был = 1

;AX=3D4Ah, если CF был = 0

Пример 2


; В полях данных:
numlow dw 0FFFFh ;Младшая часть 2-го слагаемого
numhigh dw 000Sh ;Старшая часть 2-го слагаемого
;Число 0005FFFFh=393215
;В программном сегменте:
mov AX,000Sh ;Младшая часть 1-го слагаемого
mov BX,0002h ;Старшая часть 1-го слагаемого
;Число 00020005h=131077
add АХ,numlow ;Сложение младших частей. АХ=4, CF=1
adc BX, numhigh ;Сложение старших частей с
;переносом.ВХ:АХ=0008:0004h.
;Число 00080004h=524292

Иллюстрированный самоучитель по Assembler, программы, электронные книги, раскрутка, оптимизацияДопустимо использование 32-битовых операндов и дополнительных режимов адресации 32-разрядных процессоров. Команда adc с 32-разрядными операндами может использоваться для сложения 64-разрядных целых чисел.

Пример


; В полях данных
mem321 dd 0FFFFFFFFh ;Младшая часть 1-го слагаемого
mem32h dd 98765432h ;Старшая часть 1-го слагаемого
; В программном сегменте
mov EAX,1 ;Младшая часть 2-го слагаемого
mov EBX,0 ;Старшая часть 2-го слагаемого
add EAX,mem321 ;Складываем младшие половины
;Сумма=100000000Ь>32 бит
;EAX=000000h, перенос
adc EBX,mem32h ;Складываем старшие половины
;и перенос. EBX=90000001h ;Сумма: 9876543300000000h

 

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 AX,25h

add AX,12h ;AX=0037h

Пример 3


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

mem dw 128

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

add mem,100 ;mem=228

Пример 4


mov AX,0507h ;BCD распакованное 57

 add AL,05h ;BCD 5, AX=050Ch 

aaa ;AX=0602h, BCD 62

 

Пример 5


mov AL,57h ;BCD упакованное 57

 add AL,05h ;BCD 5, AL=5Ch 

daa ;AL=62h, BCD 62

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

Пример


mov EAX,98765432h

add EAX,11111111h ; EAX=A9876543h



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


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


Первый операнд-бит 0101
Второй операнд-бит 0011
Бит результата 0001

Пример 1
mov AX,0FFEh
and AX,5555h ;AX=0554h

Пример 2
; В полях данных:
mem dw 0С003h
;В программном сегменте:
mov AX,700Eh
and AX,mem ;AX=4002h

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

Пример
mov EDX, 0FA8 8 0 0 4 lh
and EDX,0FF00000Fh ; EDX = FA000001h

 

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


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

 

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


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

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

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

Пример 1


mov BX,70h ;Анализируемое данное

bsf АХ,ВХ ;АХ=4, ZF=0

Пример 2


mov SI,0 ;Анализируемое данное

bsf BX,SI ;ZF=1, в ВХ прежнее значение

 

Пример 3


mov SI,8 ;Анализируемое данное

bsf BX,SI ;BX=3, ZF=1

Пример 4


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

mem dw 9000h Анализируемое данное

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

bsf AX, mem ;AX=000Ch=12, ZF=0

 

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


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

Пример 1


mov BX,70h ;Анализируемое данное

bsr AX,BX ;AX=6, ZF=0

Пример 2


mov SI,0 ;Анализируемое данное

bsr BX,SI ;ZF=1, в ВХ прежнее значение

 

Пример 3


mov SI,8 ;Анализируемое данное

bsf BX,SI ;BX=3, ZF=1

Пример 4


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

mem dw 9000h ; Анализируемое данное

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

bsr AX, mem ;AX=000Fh=15, ZF=0

 

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


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

Пример


mov ЕАХ, 01234567h

bswapEAX ;EAX=67452301h

 

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


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

Пример 1


mov AX,00FFh ;Анализируемое данное

bt AX,5 ; бит 5=1, ZF=1

Пример 2


mov AX,00FFh ;Анализируемое данное

bt AX,8 ;бит 8=0, ZF=0

Пример 3


mov AX,8001h ;Анализируемое данное

mov BX,15 ;Номер проверяемого бита

bt АХ,ВХ ;бит 15 = 1, ZF=1

Пример 4


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

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

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

bt mem, 4 ;бит 4 = 1, ZF=1

 

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


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

Пример 1


mov AX,00FFh ;Анализируемое данное

btc АХ, 5 ;AX=00DFh Бит 5 был = 1

;Сброс бита 5, ZF=1

Пример 2


mov AX,OOFFh /Анализируемое данное

btc АХ, 8 ;AX=lFFh Бит 8 был = О

;Установка бита 8, ZF=0

Пример 3


mov AX,8001h ;Анализируемое данное

mov BX,15 ;Номер проверяемого бита

btc AX,BX ;AX=0001h, ZF=1

Пример 4


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

mem dw IFh

;В программном сегменте: ; Анализируемое данное

btc mem, I /mem=lEh, ZF=1

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

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

Пример 1


mov AX,00Fh ;Анализируемое данное

btr АХ, 5 ;AX=00DFh. Бит 5 был = 1

;Сброс бита 5, ZF=1

Пример 2


mov AX,00FFh ;Анализируемое данное

btr AX, 8 ;AX=0FFh Бит 8 был =0

;Остался 0, ZF=0

Пример 3


mov AX,8001h ;Анализируемое данное

mov BX,15 ;Номер проверяемого бита

btr AX,BX ;AX=0001h Бит 15 был = 1

;Сброс бита 15, ZF=1

Пример 4


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

mem dw IFh

;В программном сегменте: ;Анализируемое данное

btr mem,10 ;mem=lFh Бит 10 был = 0

;Остался 0, ZF=0

 

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


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

Пример 1


mov AX,OOFFh ;Анализируемое данное

bts AX, 5 ;AX=OOFFh Бит 5 был = 1

;Остался 1, ZF=1



Пример 2


mov AX,OOFFh ;Анализируемое данное

bts AX, 8 ;AX=lFFh Бит 8 был = 0

;Установка бита 8, ZF=0

Пример 3


mov AX,8001h ; Анализируемое данное

mov BX,15 ;Номер проверяемого бита

bts AX,BX ;AX=8001h Бит 15 был = 1

;Остался 1, ZF=1

Пример 4


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

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

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

bts mem,10 ;mem=4lFh Бит 10 был = 0

; Установка бита 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 байтов (код операции 9А1г, относительный адрес вызываемой подпрограммы и ее сегментный адрес).
Косвенные вызовы отличаются тем, что адрес перехода извлекается не из кода команды, а из ячеек памяти; в коде команды содержится информация о том, где находится адрес вызова. Длина кода команды зависит от используемого способа адресации.

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


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

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

call subl ;To же самое

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

Пример 1


mov BX,offset subl ;ВХ=адрес подпрограммы

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

Пример 2


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

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

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

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

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

 

Пример 3


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

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

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

mov SI,offset addr ;SI=адрес ячейки с адресом

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

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

 

Пример 4


;В полях данных:
tbl dw subl ;Ячейка с адресом
;подпрограммы 1
dw sub2 ;Ячейка с адресом
;подпрограммы 2
dw sub3 ;Ячейка с адресом
;подпрограммы 3
;В программном сегменте:
mov BX,offset tbl ;ВХ=адрес таблицы адресов
;подпрограмм
mov SI, 2 ;SI=смещение к адресу sub2
call [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 DI,offset addr ;В1=адрес поля с адресом
;подпрограммы
call [DI] ;Вызов подпрограммы

Пример 3


; В полях данных:
tbl dd subl ;Адрес подпрограммы 1
dd sub2 ;Адрес подпрограммы 2
dd sub3 ;Адрес подпрограммы 3
;В программном сегменте:
mov SI,offset tbl ;DI=адрес таблицы адресов
mov DI,8 ;Смещение к адресу sub3
call [SI] [DI] ;Вызов подпрограммы sub3

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

Примеры


call [EAX] ;Косвенный вызов

call 8[ЕСХ] ;Косвенный вызов

 

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


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

Пример 1

mov AL,5

cdw ;AX=0005h

Пример 2


mov AL, - 2 ;AL=FEh=-2 (байт)

cdv ;AX=FFFEh=-2 (слово)

 

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


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

Пример 1


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

mem dd -2 ; Отрицательное число

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

mov ЕАХ,mem ;EAX=FFFFFFFEh

cdq ;EDX=FFFFFFFFh, EAX=FFFFFFFEh

Пример 2


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

mem dd 7FFFFFFEh ,'Положительное число

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

mov ЕАХ,mem ;EAX=7FFFFFFEh

cdq ;EDX=00000000h, EAX=7FFFFFFEh

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

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

Пример


clc ;CF=0, независимо от

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

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


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

Пример


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

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

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


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

Пример


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

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

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


<

 
MKPortal©2003-2008 mkportal.it
MultiBoard ©2007-2009 RusMKPortal