пока равно/циклическое выполнение, пока нуль




Оба обозначения представляют собой синонимы и относятся к одной команде. Команда выполняет декремент содержимого регистра СХ, и если оно не равно 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), который указывает, на сколько ба



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2016-02-16 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: