2014-01-06 7 views
0

Мы сравниваем 2 значение 1 и пиассемблера, как делает прыжок, если выше работает

тогда я использовать «прыжок, если выше» или прыгать, если больше: мы имеем: 1 - пи поэтому мы не прыгать.

Это происходит только при условии: x - значение> 0 верно, правильно? и как работает флаг переполнения в jg?

" FCOMP; st0: 1, st1: пи

fstsw топор
SAHF

JA nie_odejmuj, прыгаем ?? "

с использованием FPU

+1

Пожалуйста, укажите архитектуру, платформу и метод точного сравнения. Например. для x86: старомодный FCOM с настройкой C0-C3 и ручным копированием флагов? Новое семейство FCOMI с прямой установкой бит в Flags? Сравнение SSE? Что-то другое? – Netch

+0

Я отредактировал сообщение, вы спрашиваете меня очень сложные вопросы – yami

ответ

0

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 

Это длиннее в коде, но более четко выражает метод.

Смежные вопросы