Как часть проекта компилятора я должен написать ассемблерный код 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 выталкивает только одно значение, или это выталкивает обоих?