Оба обозначения представляют собой синонимы и относятся к одной команде. Команда выполняет декремент содержимого регистра СХ, и если оно не равно 0, и флаг ZF установлен, осуществляет переход на указанную метку вперед или назад в том же программном сегменте в диапазоне -128...+127 байтов. Содержимое регистра СХ рассматривается как целое число без знака, поэтому максимальное число повторений группы включенных в цикл команд составляет 65536. Команда не воздействует на флаги процессора.
Пример
;В полях данных, адресуемых через DS:
command db 80 dup (' ')
;В программном сегменте:
;Копирование в поле command строки,
;содержимое которой следует анализировать
lea SI,command;Настроим DS:SI
eld;Обработка вперед
mov CX,80 Дорабатывать не более 80
;байтов
pass: lodsb;3агрузим в AL очередной
; символ
cmp AL,' ';Пропустим все пробелы в
loope pass;начале строки
dec SI;Сдвиг на 1 символ назад
;DS:SI ' первый символ, отличный от пробела
386+ При использовании в качестве счетчика расширенного регистра ЕСХ максимальное число шагов в цикле увеличивается до 232. Для того, чтобы в 16-разрядном приложении процессор при выполнении команд loope/loopz использовал не 16-разрядный регистр СХ, а 32-разрядный регистр ЕСХ, перед командами loope/loopz необходимо указать префикс. замены размера адреса 67h.
Пример
mov ЕСХ, 1000000 хххх:...
db 67h loope xxxx
;Предельное число шагов;Тело цикла
LOOPNE/LOOPNZ Циклическое выполнение,
пока не равно/циклическое выполнение, пока не нуль
Оба обозначения представляют собой синонимы и относятся к од-;ной команде. Команда выполняет декремент содержимого регистра СХ,!и если оно не равно 0, и флаг ZF сброшен, осуществляет переход на указанную метку вперед или назад в том же программном сегменте в
Приложение
диапазоне -128... + 127 байтов. Содержимое регистра СХ рассматривается как целое число без знака, поэтому максимальное число повторений группы включенных в цикл команд составляет 65536. Команда не воздействует на флаги процессора.
Пример
;В полях данных:
command db 80 dup (0)
;В программном сегменте:
;Копирование в поле command строки,
;содсржимое которой следует анализировать
lea SI,command;Настроим DS:SI
eld;Обработка вперед
mov CX,80 Дорабатывать не более 80
; байтов
slash: lodsb;3агрузим в AL очередной символ
cinp AL,'/*;Ищем знак '/'
loopne slash;во всей строке
;DS:SI -> первый символ за знаком '/'
386+ При использовании в качестве счетчика расширенного регистра ЕСХ максимальное число шагов в цикле увеличивается до 232. Для того чтобы в 16-разрядном приложении процессор при выполнении команд loopne/Ioopiiz использовал не 16-разрядный регистр СХ, а 32-разрядный регистр ЕСХ, перед командами loopne/loopnz необходимо указать префикс замены размера адреса 671г.
ЕСХ, 1000000 |
Пример
Mov хххх:...
db 67h loopne xxxx
; Предельное число шагов;Тело цикла
386Р+ LSL Загрузка границы сегмента j
Команда Isl загружает в первый операнд границу сегмента из дескриптора сегмента, заданного селектором во втором операнде.
В качестве первого операнда команды Isl можно использовать 16- или 32-разрядный регистр общего назначения; в качестве второго — 16- или 32-разрядный регистр общего назначения или 16- или 32-битовое поле памяти.
386Р+ LTR Загрузка регистра задачи TR
Команда Itr загружает регистр задачи TR селектором сегмента состояния задачи TSS из второго операнда, в качестве которого можно использовать 16- или 32-разрядный регистр общего назначения или 16- или 32-битовое поле памяти. Команда используется в защищенном режиме, если программный комплекс выполнен в виде нескольких самостоятельных
Система команд процессоров Intel
задач, и переключения между ними осуществляются с использованием включенных в процессор аппаратных средств поддержки многозадачности.
MOV Пересылка данных
Команда mov замещает первый операнд (приемник) вторым (источником). При этом исходное значение первого операнда теряется. Второй операнд не изменяется. В зависимости от описания операндов, пересылается слово или байт. Если операнды описаны по-разному или режим адресации не позволяет однозначно определить размер операнда, для уточнения размера передаваемых данных в команду следует включить один из атрибутных операторов byte ptr или word ptr. Команда не воздействует на флаги процессора. В зависимости от используемых режимов адресации, команда mov может осуществлять пересылки следующих видов:
- из регистра общего назначения в регистр общего назначения;
- из регистра общего назначения в ячейку памяти;
- из регистра общего назначения в сегментные регистры DS, ES и SS;
- из ячейки памяти в регистр общего назначения;
- из ячейки памяти в сегментный регистр;
- из сегментного регистра в регистр общего назначения;
- из сегментного регистра в ячейку памяти;
- непосредственный операнд в регистр общего назначения;
- непосредственный операнд в ячейку памяти.
Запрещены пересылки из ячейки памяти в ячейку памяти (для этого предусмотрена команда movs), а также загрузка сегментного регистра непосредственным значением, которое, таким образом, приходится загружать через регистр общего назначения:
mov AX,scg mem;Сегментный адрес ячейки mem
mov DS,AX;3агрузка его в регистр DS
Нельзя также непосредственно переслать содержимое одного сегментного регистра в другой. Такого рода операции удобно выполнять с использованием стека:
push DS pop ES
Примеры
;B полях данных:
memb db 5,6
memd dd 0
;B программном сегменте: mov DX,AX mov AL,mcmb mov AX,OB800h
mov ES,AX
DS копируется в ES
;Двухсловная ячейка
;Из регистра в регистр
;Из памяти в регистр
Непосредственное значение в
;регистр
;Из регистра в сегментный
;регистр
Приложение
mov word ptr memd+2,ES;Из сегментного
;регистра в память mov word ptr memd,2000
mov BX.word ptr memb mov DI,word ptr memd |
Непосредственное;значение в память;Слово из памяти в;регистр (число 0605); Слово из памяти в;регистр
mov |
ES.word ptr memd+2;Слово из памяти в;сегментный регистр
386+ Допустимо использование 32-битовых операндов и дополнительных режимов адресации 32-разрядных процессоров.
Пример 1
mov
EAX,ESI
Пример 2
;В полях данных mem dd О;В программном сегменте mov mem,EBP
386Р+ MOV Пересылка в\из специальных регистров
^гот вариант команды mov (с той же мнемоникой, но другими кодами операций) используется в защищенном режиме и предназначен для обмена данными со специальными регистрами процессора: управляющими CRO...CR3, тестирования TR6 и TR7, а также регистрами отладки DRO...DR7. Один из операндов команды mov должен быть 32-разрядным регистром общего назначения, другим — один из специальных регистров процессора.
MOVS Пересылка данных из строки в строку MOVSB Пересылка байта данных из строки в строку MOVSW Пересылка слова данных из строки в строку
Команды предназначены для операций над строками (строкой называется последовательность байтов или слов памяти с любым содержимым). Они пересылают по одному элементу строки, который может быть байтом или словом. Первый операнд (приемник) адресуется через ES:DI, второй (источник) — через DS:SI. Операцию пересылки можно условно изобразить следующим образом:
(DS:SI) -> (ES:DI)
После каждой операции пересылки регистры SI и DI получают положительное (если флаг DF=0) или отрицательное (если флаг DF=1) приращение. Величина приращения состашшет 1 или 2 в зависимости от размера пересылаемых элементов.
^Система команд процессоров Intel
Вариант команды movs имеет формат: movs строка_1, строка_2
В этом случае байты или слова из строки строка_2 пересылаются на [место строки строка__1. Размер пересылаемых элементов определяется опи-(санием строк (с помощью директив db или dw). Это не избавляет от необходимости инициализировать регистры ES:DI и DS:SI адресами строк строка^ и строка_2. В этом формате возможна замена сегмента второй строки (источника):
movs строка_1, Е$:строка_2
Рассматриваемые команды могут предваряться префиксом повторения rep (повторять СХ раз). После выполнения рассматриваемых команд | регистры SI и DI указывают на ячейки памяти, находящиеся за теми (если DF=0) или перед теми (если DF=1) элементами строк, на которых закончились операции пересылки. Если флаг DF сброшен, то пары регистров DS:SI и ES:DI следует инициализировать начальными адресами строк-операндов; строка-источник будет пересылаться от ее начала, в порядке возрастания номеров ее байтов. Если флаг DF установлен, то пары регистров DS:SI и ES:DI следует инициализировать конечными адресами строк-операндов; строка-источник будет пересылаться от ее конца, в порядке уменьшения номеров ее байтов. Команды не воздействует на флаги процессора.
Пример 1
;В полях данных основного сегмента данных, адресуемого через DS:
txt db 'Урок Г;Пересылаемая строка
txt_len equ S-txt;Ее длина
;В патах данных дополнительного сегмента данных, адресуемого через ES:
string db 80-dup (' ')
;В программном сегменте:
;DS:SI -> txt;ES:DI -» string+10;Движение по строке вперед;Столько байтов переслать |
lea SI,txt
lea DI,string+10
eld
; Пересылка |
mov CX,txt_len
rep movsb
Пример 2
;В полях данных сегмента данных, адресуемого через DS; txt db 'A',84h,'B',841i,'A',84h,'F,
db 84h,'H',84h,'£',84h,T,84h txt_len=S-txt;B программном сегменте:
mov AX,OB800h;Сегментный адрес видеобуфера
mov ES,AX Инициализируем ES
Приложй&е
; Выведем на экран текст
mov DI,1672
lea Sl',txt
eld
mov CX,txt_len/2 rep movsw
;Смещение к середине экрана;DS:SI -> txt
;Движение по строке вперед;Столько слов переслать;Пересылка в середину экрана;красной мерцающей (атрибут;84h) надписи 'АВАРИЯ!'
Пример 3
;B полях данных сегмента datal dw 10000 dup(') data2 dw 5000 dup(');B программном сегменте
push DS
pop ES
mov SI,offset datal
add SI,5000
DI,offset data2 CX,2500 |
mov mov
eld rep movsw
Пример 4
;B полях данных сегмента file db 'MYFILE.001. name db 128 dup(');B программном сегменте
push DS
pop ES
mov SI,offset file
mov SI, 128
eld null: lodsb
cmp AL,0
loop ne null
;DS;SI -> Первый символ;завершающим нулем)
dec SI
std
mov BX,I28
sub BX,CX
данных, адресуемого через DS:;Массив произвольных данных;Массив-приемник
; Настроим
;ES на тот же сегмент данных
;SI -» datal
;Сместим SI к середине
;массива
;DI -> data2
; Размер половины массива (в
; словах)
;Движение вперед
;Перешлем вторую половину
;массива datal на место data2
, адресуемого через DS ОАТ',0;Строка-источник;Строка-приемник
;Теперь ES=DS
;DS:SI -» strl
;Максимальная длина имени
;файла
Движение по строке вперед
;3агрузим в AL очередной
; символ
;Ищем 0 в конце имени файла
за концом имени файла (за
;SI -> байт с О;Движение по строке назад;Из начального значения СХ;вычтем то, что в СХ осталось
Система команд процессоров Intel
mov CX,BX dec BX
lea DI,fname[BX] rep movsb
;СХ=число символов в имени (с 0);Смещение к 0 от начала имени файла;Смещение завершающего О;Перешлем все имя (от конца к началу)
386+ MOVSD Пересылка двойного слова из строки в строку Команда аналогична командам МП 86 movsb и movsw, но позволяет скопировать двойное слово из строки, адресуемой через регистры DS:ESI, в строку, адресуемую через регистры ES:EDI. Пример 1 ;В полях данных сегмента, адресуемого через DS strl db '01234567890АВСОЕГ;Строка-источник |
str2 db 16 dup(')
pop mov mov eld mov |
;B программном сегменте push DS ES
SI,offset strl DI,oftset str2
rep movsd |
CX,4
; Строка-приемник
;Теперь ES=DS
;DS:SI -> strl
;ES:DI -> str2
;Движение по строке вперед
;Коэффициент повторения
Копирование по 4*4 байт
386+ MOVSX Пересылка с расширением знака
Команда пересылает байт в слово или двойное слово, а также слово в двойное слово с расширением знака. В качестве первого операнда (приемника) может использоваться 16- или 32-разрядный регистр общего назначения, в качестве второго — 8- или 16-разрядный регистр общего назначения или ячейка памяти такого же размера. Недопустима пересылка из памяти в память, в или из сегментного регистра, а также непосредственного значения. Фактически команда movsx увеличивает размер как положительного, так и отрицательного числа, ни изменяя ни его значения, ни знака.
Пример 1
mov CL,-5 movsx AX,CL
Пример 2
mov CL,+5
movsx AX,CL
Пример 3
mov ВЦ-128 movsx ECX,BL
;CL=FBh
;AX=FFFBh
;CL=05h;AX=0005h
;BL=80h;ECX=FFFFFF80h
250___________________________________________________________ Приложение
Пример 4
;В полях данных
mem dw -3;mem=FFFDh
;В программном сегменте
movsx EBX,mem;EBX=FFFFFFFDh
386+ MOVZX Пересылка с расширением нуля
Команда пересылает байт в слово или двойное слово, а также слово в двойное слово с заполнением старших разрядов нулями. В качестве первого операнда (приемника) может использоваться 16- или 32-разрядный регистр общего назначения, в качестве второго — 8- или 16-разрядный регистр общего назначения или ячейка памяти такого же размера. Недопустима пересылка из памяти в память, в или из сегментного регистра, а также непосредственного значения. Фактически команда movzx увеличивает размер числа, считая его числом без знака.
Пример 1
mov CL,5;CL=05h
movsx AX,CL;AX=0005h
Пример 2
mov CL,-5;CL=FBh
movsx AX,CL;AX=OOFBh
Пример 3
mov BL,80h;BL=80h
movsx ECX,BL;ECX=00000080h
Пример 4
;B полях данных
mem dw OFFFFh;mem=FFFFh
;B программном сегменте
movsx EBX,mem;EBX=OOOOFFFFh
MUL Умножение целых чисел без знака
Команда mul выполняет умножение целого числа без знака, находящегося в регистре AL (в случае умножения на байт) или АХ (в случае умножения на слово), на операнд-источник (целое число без знака). Размер произведения в два раза больше размера сомножителей.
Для однобайтовых операций один из сомножителей помещается в регистр AL; после выполнения операции произведение записывается в регистр АХ.
Для двухбайтовых операций один из сомножителей помещается в регистр АХ; после выполнения операции произведение записывается в регистры DX:AX (в DX — старшая часть, в АХ — младшая). Предыдущее содержимое регистра DX затирается.
Система команд процессоров Intel
Если содержимое регистра АН после однобайтового умножения или содержимое регистра DX после двухбайтового умножения не равны О, флаги CF и OF устанавливаются в 1. В противном случае оба флага сбрасываются в 0.
В качестве операнда-сомножителя команды mul можно указывать регистр (кроме сегментного) или ячейку памяти; не допускается умножение на непосредственное значение. Команда воздействует на флаги OF и CF.
Пример 1
mov AL,5
mov BL,3
mul BL
Пример 2
mov AX, 2 56
mov BX,256
mul BX
;Первый сомножитель;Второй сомножитель;AX=OOOFh, произведение
;Первый сомножитель;Второй сомножитель;DX=0001h, AX=OOOOh;(DX:AX=65536, произведение)
Пример 3
;B полях данных
coef db 100
datal db 126
mov AL,datal mul coef
Пример 4
;B полях данных coef dw 50000 datal dw 1200
mov AX,datal mul coef
;Первый сомножитель;Второй сомножитель;AL=7Eh=126;АХ=313811=12600,произведение
;Первый сомножитель;Второй сомножитель;AX=4BOh=1200;DX=005Bh, AX=8D80h; Произведен ие=DX: АХ=;5B8D80h=6000000
386+ Допустимо использование 32-битовых операндов и дополнительных режимов адресации 32-разрядных процессоров. При этом, если указанный операнд представляет собой 32-байтовую величину, то результат размещается в регистрах EDXiEAX.
Пример 1
mov mov mul
EAX,200h;Первьш сомножитель
ESI,10000001h;Второй сомножитель
ESI;Произведение в EDX:EAX
;EDX=00000020h,EAX=00000002h
Пример 2 ftj*
;В полях данных У^
nmbs db 15,22,36,78,84,98,100;В программном сегменте
mov EDX,offset nmbs; Относительный адрес
; массива
mov ECX,5;Смешение в массиве
mov AL,10;Множитель
mul byte р1г[ЕВХ][ЕСХ];Умножаем элемент
;массива с индексом 5 (98);на AL (10) Результат в;АХ=980
NEG Изменение знака, дополнение до 2
Команда neg выполняет вычитание целочисленною операнда со знаком из нуля, превращая положительное число в отрицательное и наоборот. Исходный операнд затирается. В качестве операнда можно указывать регистр (кроме сегментного) или ячейку памяти размером как в байт, так и в слово. Не допускается использовать в качестве операнда непосредственное значение. Команда воздействует на флаги OF, SF, ZF, AF, PF и CF.
Примеры 1
;AX=FFFFh=-l |
mov AX.0001 neg AX
Пример 2
;BX=FFFEh=-2;BX=0002h |
mov BX,-2 neg BX
Пример 3
;В полях, данных nmb dw 800 lh
;Если число со знаком,;то -32767;В программном сегменте
neg nmb;nmb=7FFFh=+32767
386+ Допустимо использование 32-битовых операндов и дополнительных режимов адресации 32-разрядных процессоров.
Пример
mov neg
ЕСХ,5 ЕСХ
;ECX=FFFFFFFBh=-5
NOP Холостая команда
По команде пор процессор не выполняет никаких действий, кроме увеличения на 1 содержимого указателя команд IP (поскольку команда пор занимает 1 байт). Команда иногда используется в отладочных целях,
Система команд процессоров Intel
чтобы «забить» какие-то ненужные команды, не изменяя длину загрузочного модуля или, наоборот, оставить место в загрузочном модуле для последующей вставки команд. В ряде случаев команды пор включаются в текст объектного модуля транслятором. Команда не имеет ни параметров, ни операндов и не воздействует на флаги процессора.
NOT Инверсия, дополнение до 1, логическое отрицание
Команда not выполняет инверсию битов указанного операнда, заменяя 0 на 1 и наоборот. В качестве операнда можно указывать регистр (кроме сегментного) или ячейку памяти размером как в байт, так и в слово. Не допускается использовать в качестве операнда непосредственное значение. Команда не воздействует на флаги процессора.
Правила побитовой инверсии:
Операнд-бит О 1 Бит результата 10
Пример 1
mov not
AX,OFFFFh АХ
;AX=OOOOh
Пример 2
mov 51,555 Hi
not SI
;SI=AAAEh
386+ Допустимо использование 32-битовых операндов и дополнительных режимов адресации 32-разрядных процессоров.
Пример
mov not
EAX,OC003FFOOh
ЕАХ |
;EAX=3FFCOOFFh
OR Логическое ВКЛЮЧАЮЩЕЕ ИЛИ
Команда ог выполняет операцию логического (побитового) сложения двух операндов. Результат замещает первый операнд (приемник); второй операнд (источник) не изменяется. В качестве первого операнда можно указывать регистр (кроме сегментного) или ячейку памяти, в качестве второго — регистр (кроме сегментного), ячейку памяти или непосредственное значение, однако не допускается определять оба операнда одновременно как ячейки памяти. Операнды команды or могут быть байтами или словами. Команда воздействует на флаги OF, SF, ZF, PF и CF, при этом флаги CF и OF всегда сбрасываются в 0.
Правила побитового сложения:
Первый операнд-бит 0101
Второй операнд-бит 0011
Бит результата 0111
Приложение
Пример 1
mov AX.OOOFh
mov BX,OOFOh
or AX,BX
Пример 2
mov AX,OOOFh
mov BX,OOF7h
01 AX,BX
;AX=OOFFh, BX=OOFOh
;AX=OOFFh, BX=OOF7h
Пример 3
mov or
AX,OOOFh AX,8001h
;AX=800Fh
Пример 4
;B полях данных
mask db SOU
;B программном сегменте mov CH,17h or CH,mask
;CH=97h
386+ Допустимо использование 32-битовых операндов и дополнительных режимов адресации 32-разрядных процессоров.
Пример
;В полях данных
dmcm dd
;В программном сегменте or dmcm,OCOh
SOOOOOOOh
;mem=800000COh
OUT Вывод в порт
Команда out выводит в порт, указываемый первым операндом, байт или слово соответственно из регистра AL или АХ. Адрес порта помещается в регистр DX. Если адрес порта не превышает 255, он может быть указан непосредственным значением. Указание регистра-источника (AL или АН) обязательно, хотя с другими регистрами команда out не работает, и их указывать нельзя. Команда не воздействует на флаги процессора.
Пример 1
mov AL,20h out 20h,AL
;Команда конца прерывания (EOI);Вывод команды EOI в порт;20h контроллера прерываний
Пример 2
mov DX,3CEh
mov AL,5
out DX.AL
;Адрес порта
; Данное
;Вывод байта из AL в порт 3CEh
Система команд процессоров Intel
386+ Допустимо использование в качестве операнда-источника расширенного регистра ЕАХ (если адресуемое устройство позволяет записать в его порт двойное слово).
Пример
mov EAX,lA008FF3h;Пересылаемое данное
niov DX,345h;Адрес порта
out DX,EAX;Вьпюд в порт двойного слова
386+
OUTS Вывод строки в порт
OUTSB Вывод байта в порт
OUTSW Вывод слова в порт
OUTSD Вывод двойного слова в порт
Команды предназначены для вывода данных в порт непосредственно из памяти. Адрес порта указывается, как и для команды out, в регистре DX, при этом задание адреса порта непосредственным значением не допускается. Данные извлекаются из памяти по адресу, находящемуся в паре регистров DS:ESI. Замена сегмента не допускается. Команда outsb передает в порт 1 байт, команда outsw — 1 слово, команда outsd — 1 двойное слово, а команда outs может быть использована для передачи байтов, слов и двойных слов. В последнем случае размер загружаемого данного определяется описанием строки (с помощью директив db, dw или dd). После передачи данных регистр ESI получаст положительное (если флаг DF=0) или отрицательное (если флаг DF=1) приращение. Величина приращения составляет 1, 2 или 4 в зависимости от размера передаваемых данных.
Вариант команды outs имеет формат
outs DX, строка
(что не избавляет от необходимости инициализировать регистры DS:ESI адресом строки).
Если устройство, адресуемое через порт, может принимать последовательность данных, то команды outs можно предварить префиксом повторения rep. В этом случае в порт пересылается СХ элементов данных заданного размера.
Команды outs не воздействуют на флаги процессора.
Пример 1
;В полях данных
mem dw OFFh
;В программном сегменте
mov SI,offset mem;ES;DI ' mem
mov DX,303h;Адрес порта
outsb;Вывод в порт 8-битового
данного
Приложение
Пример 2
;В полях данных string dw OFFh,l,5,OBli,0;В программном сегменте mov SI,offset mem
mov mov eld outsb |
DX,340h
CX,5
rep
;ES:DI -»• mem
;Адрес порта
;Число данных
Движение по данным вперед
;Последовательный вывод в
;порт пяти 8-битовых данных
POP Извлечение слова из стека
Команда pop выталкивает 16-битовое данное из стека, т.е. пересылает слово из вершины стека (на которую указывает регистр SP) по адресу операнда-приемника. После этого содержимое SP увеличивается на 2, и SP указывает на предыдущее слово стека, которое теперь является его новой вершиной. Вытшткивать из стека можно только целые слова (не байты). Программа должна строго следить за тем, чтобы каждой команде проталкивания в стек push отвечшта обратная команда выталкивания из стека pop. Если стек используется для временного хранения некоторых данных, то изштекать эти данные из стека следует в порядке, обратном их сохранению.
В качестве операнда-приемника можно использовать любой 16-разрядный регистр (кроме CS) или ячейку памяти. Команда не воздействует на флаги процессора.
Пара команд push — pop часто используется для пересылки данного из регистра в регистр (особенно, в сегментный) через стек.
Пример 1
push AX
push BX
push DS
pop DS
pop BX
pop AX
;Временное сохранение
;в стеке
;трех операндов
)
;Восстановление из стека.;трех операндов;в обратном порядке
Пример 2
push pop
CS DS
;Пересылка CS через стек;Теперь DS=CS
Пример 3 ;В полях данных mem dw О;В программном сегменте pop mem
;Восстановление из стека в память
Система команд процессоров Intel
386+ Допустимо использование 32-битовых операндов и дополнительных режимов адресации 32-разрядных процессоров.
Пример
pop
ЕАХ
;Извлечение из стека двойного слова
386+ РОРА Восстановление из стека всех регистров
Команда рора восстанавливает из стека содержимое всех регистров, предварительно сохраненных в стеке командой pusha. Заполнение из стека регистров осуществляется в следующем порядке: DI, SI, BP, BX, SP, DX, СХ, АХ. Исходное содержимое указателя стека SP, сохраненное в стеке командой pusha, командой рора из стека извлекается, но отбрасывается. Команда не имеет параметров.
Пример
рора
386+ POPAD Восстановление из стека всех регистров в 32-разрядном режиме
Команда рора восстанавливает из стека содержимое всех расширенных регистров, предварительно сохраненных в стеке командой pushad. Заполнение из стека регистров осуществляется в следующем порядке: EDI, ESI, ЕВР, ЕВХ, EDX, ЕСХ, ЕАХ. Исходное содержимое указателя стека ESP, сохраненное в стеке командой pusha, командой рора из стека извлекается, но отбрасывается. Команда не имеет параметров.
Пример
popad
POPF Восстановление из стека регистра флагов
Команда popf пересыпает верхнее слово стека (на которое указывает регистр SP) в регистр флагов FLAGS. После этого содержимое SP увеличивается на 2, и SP указывает на предыдущее слово стека, которое теперь является его новой вершиной. Команда popf не имеет параметров; она воздействует на все флаги процессора, включая управляющие флаги IF и TF.
Пример 1
; Регистр флагов загружается из стека |
popf
Пример 2
;Отправим флаги в стек;Настроим ВР на флаги в стеке;Установим бит lOOh (флаг TF);Вытолкнем в регистр флагов.;Теперь в регистре флагов TF=1 |
pushf
mov BP,SP
or [BP],100h
popf
258___________________________________________________ Приложение
386+ POPFD
Восстановление из стека расширенного регистра флагов
Команда popfd пересылает верхнее слово стека (на которое указывает регистр ESP) в расширенный регистр флагов EFLAGS. После этого содержимое ESP увеличивается на 4, и ESP указывает на предыдущее слово стека, которое теперь является его новой вершиной. Команда popfd не имеет параметров; она воздействует на все флаги процессора, кроме флагов RF и VM.
Пример
popfd;Регистр EFLGS загружается из стека
PUSH Занесение операнда в стек
Команда push уменьшает на 2 содержимое указателя стека SP и заносит на эту новую вершину двухбайтовый операнд-источник (проталкивает в стек новое данное). Проталкивать в стек можно только целые слова (не байты). Программа должна строго следить за тем, чтобы каждой команде проталкивания в стек push отвечала обратная команда выталкивания из стека pop. Если стек используется для временного хранения некоторых данных, то извлекать эти данные из стека следует в порядке, обратном их сохранению.
В качестве one ранда-источника может использоваться любой 16-разрядный регистр (включая сегментный) или ячейка памяти. Не допускается занесение в стек непосредственного значения, хотя некоторые трансляторы преобразуют команду вида
push 1234h
в неэффективную последовательность операций со стеком, результатом которой будет проталкивание указанного операнда в стек. Команда push не воздействует на флаги процессора.
Пара команд push — pop часто используется для пересылки данного из регистра в регистр (особенно, в сегментный) через стек.
Пример 1
push ES:mera;Сохранение содержимого
push DS;слова памяти mem из
push BP дополнительного сегмента
;а также регистров DS и ВР
pop PP; Восстановление из стека
pop DS;трех операндов
pop ES:mem;в обратном порядке
Пример 2
push DS;Пересылка DS через стек
pop ES;Теперь ES=DS
Система команд процессоров Intel
386+ Допустима засылка в стек 32-битовых операндов (регистров и ячеек памяти), а также занесение в стек 8-, 16- и 32-битовых непосредственных значений. Каждое 8-битовое значение занимает в стеке целое слово. Операнды любого допустимого размера могут заноситься в стек вперемежку, если это не вступает в противоречие с операциями по извлечению этих данных из стека.
Пример 1
АХ 32h |
push push
push EAX
;Сохранение в стеке регистра АХ;Сохранение в стеке;константы 32h (она займет в;стеке 1 слово)
;Сохранение в стеке регистра;ЕАХ (два слова стека)
386+ PUSHA Сохранение в стеке всех регистров
Команда pusha сохраняет в стеке содержимое всех регистров в следующем порядке: АХ, СХ, DX, ВХ, значение указателя стека SP перед выполнением данной команды, далее ВР, SI и DI. Команда не имеет параметров и не воздействует на флаги процессора.
Пример
pusha
386+ PUSHAD Сохранение в стеке всех регистров в 32-разрядном режиме
Команда pushad сохраняет в стеке содержимое всех регистров в следующем порядке: EAX, ECX, DX, ВХ, значение указателя стека ESP перед выполнением данной команды, далее EBP, ESI и EDI. Команда не имеет параметров и не воздействует на флаги процессора.
Пример
pushad
386+ PUSHFD Занесение в стек содержимого расширенного регистра флагов
Команда pushfd уменьшает на 4 содержимое указателя стека ESP и заносит на эту новую вершину содержимое расширенного регистра флагов EFALGS. При этом сохраняются все флаги процессора. Команда pushfd не имеет параметров и не воздействует на флаги процессора.
Пример pushfd |
;Содержимое регистра флагов Сохраняется в стеке
Приложение
RCL Циклический сдвиг влево через бит переноса
Команда rcl осуществляет сдвиг влево всех битов операнда. Если команда записана в формате
rcl операнд, 1
сдвиг осуществляется на 1 бит. В младший бит операнда заносится значение флага CF; старший бит операнда загружается в CF. Если команда записана в формате
rcl операнд,СЬ
сдвиг осуществляется на число бит, указанное в регистре-счетчике CL, при этом в процессе последовательных сдвигов старшие биты операнда поступают сначала в CF, а оттуда — в младшие биты операнда (рис. П4).
^_ | ||||
CF | Операнд |
Рис. П4. Действие команды rcl.
В качестве операнда команды rcl можно указывать любой регистр (кроме сегментного) или ячейку памяти размером как в байт, так и в слово. Не допускается использовать в качестве операнда непосредственное значение. Команда воздействует на флаги OF и CF.
Пример 1
clc
mov AX, 7
rcl AX,1
Пример 2
stc
mov DL,7
rcl DL,1.
Пример З
clc
mov BX,OFFFFh
rcl BX,1
Пример 4
clc
mov DH,3 mov CL,4 rcl DH,CL
; Сбросим CF;AX=OOOEh=14, CF=0
;Установим CF;DL=OFh=15, CF=0
;Сбросим CF;BX=FFFEh, CF=1
; Сбросим CF
; Счетчик сдвигов;DH=30h=48, CF=0
Система команд процессоров Intel
386+ Допустим сдвиг 32-битовых операндов. Допустимо указание числа битов сдвига как с помощью регистра CL, так и непосредственным значением. Максимальная величина сдвига составляет 31 бит.
Пример mov clc rcl |
EAX,OC0000003h
EAX |
;Сбросим CF;EAX=OOOOOOODh, CF=1
RCR Циклический сдвиг вправо через бит переноса
Команда гсг осуществляет сдвиг вправо всех битов операнда. Если команда записана в формате
гсг операнд, 1
сдвиг осуществляется на 1 бит. В старший бит операнда заносится значение флага CF; младший бит операнда загружается в CF. Если команда записана в формате
rcl операнд.СЬ
сдвиг осуществляется на число бит, указанное в регистре-счетчике CL, при этом в процессе последовательных сдвигов младшие биты операнда поступают сначала в CF, а оттуда — в старшие биты операнда (Рис. П5).
L». | — > | _^J | ||
Операнд | CF |
Рис. П.5. Действие команды гсг.
В качестве операнда можно указывать любой регистр (кроме сегмент-, ного) или ячейку памяти размером как в байт, так и в слово. Не допускается использовать в качестве операнда непосредственное значение. Команда воздействует на флаги OF и CF.
Пример 1
clc
mov AX, 2
гсг АХ,1
Пример 2
stc
mov DL,8
гсг DL,1
Пример 3
clc
mov BX.OFh
rcr BX,1
;Сбросим флаг CF;AX=1, CF=0
;Установим флаг CF;DL=84h, CF=0
;Сбросим флаг CF;BX=7, CF=1
262______________________________________ ____________ Приложение
Пример 4 | |
clc | ;Сбросим флаг CF |
mov DH,80h | |
mov CL,S | ; Счетчик сдвигов |
rcr DH,CL | ;DH=4, CF=0 |
386+ Допустим сдвиг 32-битовых операндов. Допустимо указание числа бит сдвига как с помощью регистра CL, так и непосредственным значением. Максимальная величина сдвига составляет 31 бит.
Пример
mov ESI,OFFFF0001h
clc;Сбросим флаг CF
rcr ESI,8;ESI=02FFFFOOh, CF=0
Pentium+P RDMSR Чтение особого регистра модели
Команда читает содержимое внутреннего регистра, специфического для конкретной модели процессора.
REP Повторение
REPE Повторение пока'равно
REPZ Повторение пока нуль
REPNE Повторение пока равно
REPNZ Повторение пока не равно
Префиксы повторения, позволяющие организовывать циклическое выполнение команд обработки строк cmps, niovs и seas, и при этом проверять наличие указанного в префиксе условия.
Префикс rep, будучи установлен перед строковой командой niovs или stos, заставляет ее выполняться СХ раз.
Префикс гере (и полностью эквивалентный ему префикс repz), будучи установлен перед строковой командой cmps или seas, заставляет ее выполняться до тех пор, пока результат выполнения равен 0 и, соответственно, ZF=1, но не более СХ раз.
Префикс герпе (и полностью эквивалентный ему префикс repnz), будучи установлен перед строковой командой cmps или seas, заставляет ее выполняться до тех пор, пока результат выполнения не равен 0 и, соответственно, ZF=0, но не более СХ раз.
Примеры использования префиксов повторения см. в описаниях строковых команд cmps, movs и seas.
RET Возврат из процедуры
RETN Возврат из ближней процедуры
RETF Возврат из дальней процедуры
Команда ret извлекает из стека адрес возврата и передаст управление назад в программу, первоначально вызвавшую процедуру. Если командой ret завершается ближняя процедура, объявленная с атрибутом near, или используется модификация команды retn, со стека снимается одно слово
Система команд процессоров Intel
— относительный адрес точки возврата. Передача управления в этом случае осуществляется в пределах одного программного сегмента. Если командой ret завершается дальняя процедура, объявленная с атрибутом far, или используется модификация команды retf, со стека снимаются два слова: смещение и сегментный адрес точки возврата. В этом случае передача управления может быть межсегментной.
В команду ret может быть включен необязательный операнд (кратный 2), который указывает, на сколько ба