Команды сравнения данных
Команды сравнения данных сравнивают значение числа в вершине стека и операнда, указанного в команде.
fcom [операнд_в_памяти ] – команда без операндов сравнивает два значения: одно находится в регистре st(0), другое в регистре st(1). Если указан операнд [операнд_в_памяти ], то сравнивается значение в регистре ST(0) стека сопроцессора со значением в памяти.
fcomp операнд – команда сравнивает значение в вершине стека сопроцессора st(0)со значением операнда, который находится в регистре или в памяти. Последним действием команды является выталкивание значения из st(0).
fcompp операнд – команда аналогична по действию команде fcom без операндов, но последним ее действием является выталкивание из стека значений обоих регистров, st(0)и st(1).
ficom операнд_в_памяти – команда сравнивает значение в вершине стека сопроцессора st(0) с целым операндом в памяти. Длина целого операнда — 16 или 32 бита, то есть это целое слово и короткое целое.
ficomp операнд – команда сравнивает значение в вершине стека сопроцессора st(0) с целым операндом в памяти. После сравнения и установки битов С3...С0 команда выталкивает значение из ST(0). Длина целого операнда – 16 или 32 бита, то есть это целое слово и короткое целое.
ftst – команда не имеет операндов и сравнивает значения в st(0) с нулем (значением 00).
Предыдущие команды сравнения работают корректно, если операнды в них являются целыми или вещественными числами. Когда один из операндов оказывается нечислом, то фиксируется исключение недействительной ситуации, а коды условия С3...С0 соответствуют исключительной ситуации несравнимых или неупорядоченных операндов. Само же действие сравнения не производится.
Процессор предоставляет три команды, позволяющие все же произвести сравнение таких операндов, но как вещественных чисел без учета их порядков.
fucom st(i) – команда сравнивает значения (без учета их порядков) в регистрах стека сопроцессора st(0)и st(i).
fucomp st(i) – команда сравнивает значения (без учета их порядков) в регистрах стека сопроцессора st(0)и st(i). Последним действием команды является выталкивание значения из вершины стека.
fucompp st(i) – команда сравнивает значения (без учета их порядков) в регистрах стека сопроцессора st(0)и st(i). Последние два действия команды одинаковы — выталкивание значения из вершины стека.
В результате работы команд сравнения в регистре состояния устанавливаются следующие значения битов кода условия С3,С2,С0:
если st(0)>операнда, то 000;
если st(0)<операнда, то 001;
если st(0)=операнду, то 100;
если операнды неупорядочены, то 111.
Для того чтобы получить возможность реагировать на эти коды командами условного перехода основного процессора (вспомните, что они реагируют на флаги в EFLAGS), нужно как-то записать сформированные биты условия СЗ,С2,СО в регистр ЕFLAGS.В системе команд сопроцессора существует команда FSTSW, которая позволяет запомнить слово состояния сопроцессора в регистре АХ или ячейке памяти. Далее значения нужных битов извлекаются и анализируются командами основного процессора.
Например, запись старшего байта слова состояния, в котором находятся биты СО...СЗ, в младший байт регистра EFLAGS/FLAGS осуществляется командой SAHF. Эта команда записывает содержимое АН в младший байт регистра EFLAGS/FLAGS. После этого бит С0 записывается на место флага CF,C2 — на место PF,СЗ — на место ZF. Бит С1 выпадает из общего правила, так как в регистре флагов на месте соответствующего ему бита находится единица. Анализ этого бита нужно проводить с помощью логических команд основного процессора. Зная все это, вам остается, исходя из особенностей своего алгоритма, применять те команды условного перехода, которые анализируют состояние указанных флагов.
К группе команд сравнения данных логично отнести и команду FXAM, которая анализирует операнд в вершине стека сопроцессора ST(0)и формирует значение битов СО,Cl,С2,СЗ в регистре состояния сопроцессора SWR. По состоянию этих битов можно судить:
– о знаке мантиссы — знаковый бит операнда в st(0) заносится в бит c0 регистра SWR;
– корректности записи вещественного числа в ST(0)— идентифицируются пустой регистр, корректное вещественное число, нечисло и неизвестный формат;
– типе специального численного значения: бесконечность, нуль, денормализованный операнд.
Дата добавления: 2015-04-15; просмотров: 1560;