CMPS строка_приемник, строка_источник
Команда сравнения строк CMPS сопоставляет операнд-источник с операндом-приемником и возвращает результат через флаги. Команда не изменяет значения операндов. Алгоритм:
1. выполнить вычитание элементов (источник - приемник), адреса элементов предварительно должны быть загружены:
адрес источника — в пару регистров ds:esi/si;
адрес назначения — в пару регистров es:edi/di;
2. в зависимости от состояния флага df изменить значение регистров esi/si и edi/di: если df=0, то увеличить содержимое этих регистров на длину элемента последовательности; если df=1, то уменьшить содержимое этих регистров на длину элемента последовательности; в зависимости от результата вычитания установить флаги: если очередные элементы цепочек не равны, то cf=1, zf=0; если очередные элементы цепочек или цепочки в целом равны, то cf=0, zf=1;
4. при наличии префикса выполнить определяемые им действия ( repe/repne).
Команда CMPS сравнивает операнды с помощью их вычитания, а именно вычитается операнд-приемник из операнда-источника. Для сравнения нескольких элементов команду CMPS надо использовать с префиксами повторения REPE (REPZ) – пока CX не станет равен нулю или не будет найдена пара несовпадающих элементов; или REPNE (REPNZ) – пока СХ не станет равным нулю, либо не будет найдена пара совпадающих элементов.
CMPSВ
CMPSW не требуют операндов
CMPSD
Команды сканирования
Команды сканирования строк позволяют осуществить поиск заданного значения в строке. При сканировании строки байтов искомое значение должно находиться в регистре AL, а при сканировании строки слов – в регистре АХ, а при сканировании строки двойных слов – в регистре ЕАХ.
SCAS строка_приемник
SCASB
SCASW адрес сканируемой строки ESI/SI
SCASD
Алгоритм работы:
1. выполнить вычитание (элемент цепочки-(eax/ax/al)). Элемент цепочки локализуется парой es:edi/di. Замена сегмента es не допускается;
2. по результату вычитания установить флаги;
3. изменить значение регистра edi/di на величину, равную длине элемента цепочки. Знак этой величины зависит от состояния флага df:
df=0 — величина положительная, то есть просмотр от начала цепочки к ее концу;
df=1 — величина отрицательная, то есть просмотр от конца цепочки к ее началу
Команды загрузки
Данные команды служат для того, чтобы загрузить элемент строки в регистр, имеют формат:
LODS строка_источник
lodsb
lodsw
lodsd
Алгоритм работы:
1. загрузить элемент из ячейки памяти, адресуемой парой ds:esi/si, в регистр al/ax/eax.
2. Размер элемента определяется неявно (для команды lods) или явно в соответствии с применяемой командой ( lodsb, lodsw, lodsd);
3. изменить значение регистра si на величину, равную длине элемента цепочки.
4.Знак величины зависит от состояния флага df:
df=0 — значение положительное, то есть просмотр от начала цепочки к ее концу;
df=1 — значение отрицательное, то есть просмотр от конца цепочки к ее началу.
Команды не влияет на флаги
Команда записи
Данные команды служат для того, чтобы загрузить элемент строки в регистр или изменить его, имеют формат:
STOS строка_приемник
STOSB
STOSW
STOSD
Алгоритм работы:
1. записать элемент из регистра al/ax/eax в ячейку памяти, адресуемую парой es:di/edi.
2. Размер элемента определяется неявно (для команды stos) или конкретной применяемой командой (для команд stosb, stosw, stosd);
3. изменить значение регистра di на величину, равную длине элемента цепочки.
3. Знак изменения зависит от флага df:
df=0 — увеличить, что означает просмотр от начала цепочки к ее концу;
df=1 — уменьшить, что означает просмотр от конца цепочки к ее началу.
выполнение команды не влияет на флаги
получение элементов цепочки из порта ввода-вывода:
ins адрес_приемника,номер_порта
insb
insw
insd
вывод элементов цепочки в порт ввода-вывода:
outs номер_порта,адрес_источника
outsb
outsw
outsd
Регистры сопроцессора
Арифметический сопроцессор содержит 8 численных 80-битовых регистров. Регистры общего назначения (стек): ST(0), ST(1), … , ST(7).
Управляющие регистры: CWR, SWR, TWR, FIP, FDR
Регистр тегов (Tags Word Register). Поля регистра тегов классифицируют содержимое соответствующего численного регистра.
Регистр управления (Control Word Register)
Регистр состояния (Status Word Register) содержит флажки особых случаев.
Команды пересылки данных
Запись в стек
Команды FLD, FILD, FBLD загружают в вершину стека ST(0) вещественное, целое и десятичное числа соответственно
Извлечение из стека
FSTP память <-ST(0), вещественный формат
FISTP память <-ST(0), целочисленный формат
FBSTP память <-ST(0), десятичный формат
После записи содержимое поля ST увеличивается на 1
Копирование данных: содержимое стека не изменяется
Загрузка констант
fldz 0
fld 1
fld pi
fldl2t log2(10)
fldl2e log2(e)
fldlg2 lg2
fldln2 ln2
Команда обмена fxch меняет содержимое регистра, указанного в этой команде с регистром ST(0)
Арифметические команды
Сопроцессор использует 6 основных типов арифметических команд, имеющих вид FXXX (FADD, FSUB, FSUBR, FMUL, FDIV, FDIVR)
Команды вида FXXX ?… : первый операнд берется из верхушки стека (источник), второй – следующий элемент стека. Результат выполнения команды записывается в стек.
Команды вида FXXX память: источник берется из памяти, приемником является верхушка стека ST(0)
Указатель стека не меняется, команда действительна только для операндов с одинарной и двойной точностью.
FIXXX память – аналогично предыдущему операнду, но операции могут быть 16- или 32-битовые целые числа
FXXX ST, ST(i): регистр ST(i) является источником, а ST(0) – приемником. Указатель стека не изменяется.
FXXX ST(i), ST: регистр ST(0) является источником, а ST(i) – приемником. Указатель стека не изменяется.
Кроме основных арифметических команд существуют еще дополнительные команды: FSQRT (квадратный корень), FSCALE (масштабирование на степень числа 2), FPREM, FRNDINT (округление до целого), FXTRACT, FABS, FCHS
Команды сравнения чисел
FCOM сравнение
FICOM целочисленное сравнение
FCOMP сравнение и извлечение из стека
FICOMP целочисленное сравнение и извлечение из стека
FCOMPP сравнение и двойное извлечение из стека
FTST сравнение операнда с нулем
FXAM анализ операнда
FCOM вычитает содержимое операнда, размещенного в ST(0)
С помощью команды «FSTSW AX» программа может переписать содержимое регистра состояния сопроцессора в регистр AX центрального процессора.
Трансцендентные команды
-тригонометрические:
Fsin sin(st)->st
fsincos sin(st)->st, cos(st)->st
fcos cos(st)
fptan tg(st)->st, fld1
fpatan arctg(st(st(1))->st
-степенные и логарифмеческие
f2xm1 2^st-1->st, -1<x<1
fy2xpl st(1)*log2(st+1)->st(1), pop
fy12x st(1)*log2(st)->st(1), pop
Управляющие команды
FINIT – очищает все регистры
FSAVE – сохраняет состояние регистров в памяти
FSTST
Синхронизация СP и FPU: wait/fwait
Команда CALL
Команда callпередает управление подпрограмме, сохранив перед этим в стеке смещение к точке возврата.
Команда ret, которой обычно заканчивается подпрограмма, забирает из стека адрес возврата и возвращает управление на команду, следующую за командой call. Команда не воздействует на флаги процессора.
Команда call имеет четыре модификации:
- вызов прямой ближний (в пределах текущего программного сегмента);
- вызов прямой дальний (вызов подпрограммы, расположенной в другом программном сегменте);
- вызов косвенный ближний;
- вызов косвенный дальний.
Все разновидности вызовов имеют одну и ту же мнемонику call, хотя и различающи-еся коды операций. Во многих случаях транслятор может определить вид вызова по контексту, если это невозможно, следует использовать атрибутные операторы:
near ptr - прямой ближний вызов;
far ptr - прямой дальний вызов;
word ptr - косвенный ближний вызов dword ptr - косвенный дальний вызов.