Любопытные флаги в FPU команд FCOMP и FCOMI

У меня есть вопрос о поведении флагов в fpu после выполнения операции fcomp. У fpu-стека нет переполнений, в обоих фрагментах кода одни и те же значения участвуют в операциях сравнения.

Почему этот код работает:

fldz                ;[0] 
fadd dword [esp+4]  ;[x]
fld1                ;[1][x]
fcomip st0, st1     ;compare 1, x
                    ;[x] because fcomip pops the 1
je xeins            ;falls x = 1: special routine
fld1                ;[1][x]
fxch st0, st1       ;[x][1]
fcomi st0, st1      ;compare x, 1
jc xinval           ;if x < 1 (carry = 1): special routine

А этот код нет?

fldz                ;[0] 
fadd dword [esp+4]  ;[x]
fld1                ;[1][x]
fcomip st0, st1     ;compare 1, x
                    ;[x] because fcomip pops the 1
je xeins            ;if x = 1: special routine
fld1                ;[1][x]
fcomip st0, st1     ;compare x, 1
jc xinval           ;if x < 1 (carry = 1): special routine

0 ответов

Другие вопросы по тегам