46. Команды сопроцессора для сравнения. Организация проверки битов условий

Команды сравнения данных сравнивают значение числа в вершине стека и операнда, указанного в команде.
FCOM [<операнд_в_памяти>] — сравнение двух значений: ST(0) и SТ(1). Если указан операнд [операнд_в_памяти], то сравнивается значение в регистре ST(0) стека сопроцессора со значением в памяти.
FCOMP <операнд (регистр или память)> — сравнение значений в ST(0) и операнда Выталкивание значения из ST(0).
FCOMPP <операнд> — команда аналогична по действию команде FCOM без операндов, но последнее действие — выталкивание из стека ST(0) и ST(1).
FICOM <целый операнд (память)> — сравнение значения ST(0) с операндом. Длина целого операнда — 16 или 32 бита, то есть это целое слово и короткое целое.
FICOMP <целый операнд (память)> —сравнение значения ST(0) с операндом. После сравнения и установки битов СЗ…СО команда выталкивает значение из ST(0).
FTST —сравнение значения в ST(0) с нулем (значением 00).
Эти команды работают корректно, если операнды в них являются целыми или вещественными числами. Если один из операндов — не число, то фиксируется исключение недействительной ситуации, а коды условия СЗ.. .СО соответствуют исключительной ситуации несравнимых или неупорядоченных операндов. Сравнения не производится. Для сравнения таких операндов можно использовать:
FUCOM —сравнение значения (без учета их порядков) в ST(0) и ST(i).

В результате работы команд сравнения в регистре состояния устанавливаются следующие значения битов кода условия СЗ, С2, СО:



Чтобы передать результаты сравнения из сопроцессора основному процессору для обработки полученных кодов командами условного перехода основного процессора, нужно записать биты условия в регистр процессора eflags.

Для этого:

  • Сразу после сравнения код необходимо сохранить в регистре AX или в памяти.Для этого в системе команд сопроцессора есть специальная команда:
    FSTSW AX — сохранить слово состояния в регистре AX
  • Затем значения нужных бит извлекаются и анализируются основным процессором.
    Это можно сделать двумя способами:
    а) загрузить коды во флаговый регистр:
    SAHF — команда копирует биты: С3 в ZF, С2 в PF, а С0 в СF
    Бит C1 выпадает из общего правила, так как в регистре флагов на месте соответствующего ему бита находится единица. Анализ этого бита нужно проводить с помощью логических команд основного процессора. Далее для перехода можно использовать команды JE, JNE, JA, JB, JBE, а для проверки операндов не чисел – команду JP;

    б) можно использовать команду TEST AX,<константа кода>

17.07.2015