ja
нуждается CF == 0 и ZF == 0. Он не проверяет OF. В флагах x87 это означает C0 == 0 и C3 == 0. Это именно то условие, что ST (0)> ST (1) для сравнения с использованием FCOM
, FCOMP
и т.д.
Вы не следует путать с формальным различием условий (как ja
для сравнения чисел без знака), потому что x87 состояние флагов отличаются и передаются здесь с использованием специального транспорта. Возможно, даже можно увидеть абсолютно несоответствующие условия, но Intel попыталась обеспечить, по крайней мере, много сходства между условиями и инструкциями по проверке.
OTOH, jg
, да, проверяет очень другие условия с битами, которые не передаются с использованием fstsw
+ sahf
. Поэтому здесь это неприменимо, даже если оно названо так же, как и необходимое условие.
Это устаревшая проблема, а также множество других странных решений x86. (30+ лет разработки без редизайна с нуля не дают постоянного результата. OTOH, все они хорошо документированы, поэтому вы должны просто следовать известным рецептам.)
ОБНОВЛЕНИЕ: Кстати, вы также можете пропустить sahf
и проверить флаги непосредственно:
fstsw ax
test ax, 4100h
jz nie_odejmuj
Это длиннее в коде, но более четко выражает метод.
Пожалуйста, укажите архитектуру, платформу и метод точного сравнения. Например. для x86: старомодный FCOM с настройкой C0-C3 и ручным копированием флагов? Новое семейство FCOMI с прямой установкой бит в Flags? Сравнение SSE? Что-то другое? – Netch
Я отредактировал сообщение, вы спрашиваете меня очень сложные вопросы – yami