ассемблер x86: плавающая точка выдерживает сравнение

Как часть проекта компилятора я должен написать ассемблерный код GNU для x86 для сравнения значений с плавающей точкой. Я попытался найти ресурсы о том, как сделать это онлайн и от того, что я понимаю, что это работает как это:

Принятие двух значений, которые я хочу сравнить, является единственными значениями на стеке с плавающей точкой, затем , инструкция fcomi сравнит значения и установит флаги ЦП так, чтобы je, jne, jl... инструкции могли использоваться.

я спрашиваю, потому что это только иногда работает. Например:

.section    .data
msg:    .ascii "Hallo\n\0"
f1:     .float 10.0
f2:     .float 9.0

.globl main
    .type   main, @function
main:
    flds f1
    flds f2
    fcomi
    jg leb
    pushl $msg
    call printf
    addl $4, %esp
leb:
    pushl $0
    call exit

не распечатает "Привет" даже при том, что я думаю, что это должно, и если вы переключите f1 и f2, то это все еще не будет, который является логическим противоречием. je и jne однако, кажется, хорошо работают.

, Что я делаю неправильно?

пз: fcomip выталкивает только одно значение, или это выталкивает обоих?

15
задан ecm 24 July 2019 в 23:46
поделиться