Главная страница
Предыдущая страница (Команды управления FPU)

Дополнительные возможности сопроцессора


Дополнительные 4 типа данных для сопроцессора:

1) fbld источник – загрузить десятичное число в стек. Преобразовывает BCD-число из источника (m80) и помещает в стек. Структура двоично-десятичных чисел такова: в первых девяти байтах (c нулевого по восьмой) хранится модуль BCD-числа. Каждые 4 бита BCD-числа содержат десятичную цифру (подобно двоично-десятичным командам ALU). Например, число 127 запишется так:
9-й байт 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000001 00100111
Число 327 запишется так:
9-й байт 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000011 00100111
Старший бит девятого байта хранит знак числа. Остальные биты девятого байта ни на что не влияют. Поэтому если старший бит в диапазоне от 0 до 127, то число положительное, а если старший бит в диапазоне от 128 до 255, то число отрицательное. Поэтому, например, если число записано так:
10001111 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 10001000, то это -88

2) fbstp приёмник – считать десятичное число из стека. Попытка записи слишком большого числа приводит к вылетанию программы (если IM=0)

3) fiadd источник – источником является m16|m32, содержащая целое число, приёмник – st(0)

4) (fisub, fisubr, fimul, fidiv, fidivr) источник – аналогично fiadd

5) ficom источник – сравнить целые числа
5) ficomp источник – сравнить целые числа и вытолкнуть из стека
Эти команды сравнивают содержимое регистра st(0) и источника (m16|m32), причём считается, что источник содержит целое число. Остальное аналогично fcom|fcomp

Три дополнительные инструкции для pentium2

1) fcmovcc приёмник, источник – набор команд, каждая из которых копирует содержимое источника (регистр st(n) в приёмник (только st(0)), если выполняется необходимое условие. Реально каждое условие соответствует тем или иным значениям регистра flags:
Команда
Флаги
Действие
fcmove
ZF=1
если равно
fcmovne
ZF=0
если не равно
fcmovb
CF=1
если меньше
fcmovbe
CF=1 и ZF=1
если меньше или равно
fcmovnb
CF=0
если не меньше
fcmovnbe
CF=0 и ZF=0
если не меньше или равно
2) fcomi|fcomip источник – сравнивает и устанавливает flags. Выполняет сравнение регистра st(0) и источника (регистр st(i)), и устанавливает флаги. Работает быстрее, чем с помощью последовательности команд fcom|fcomp|fcompp, fstsw, sahf:
Условие
ZF
CF
st(0)>источник
0
0
st(0)<источник
0
1
st(0)=источник
1
0
fcomip кроме этого выталкивает один операнд из стека. После этих команд можно пользоваться командами условного перехода ja, jae, jb, jbe, je, jne. Понятно, что бессмысленно пользоваться теми командами условного перехода, которые в качестве условия для перехода используют какие-либо флаги помимо ZF и CF. Можете не пытаться использовать, например, jg или jl

3) fucomi|fucomip источник – сравнение аналогично fcomi|fcomip, но без учёта поряд-ков, то есть сравниваются мантиссы (думаю, сравниваются как целые)


СЛЕДУЮЩИЙ РАЗДЕЛ (Расширение MMX)