Как часть проекта компилятора я должен написать код ассемблера GNU для x86, чтобы сравнить значения с плавающей запятой. Я попытался найти ресурсы о том, как сделать это онлайн, и насколько я понимаю, это работает так:
Предполагая, что два значения, которые я хочу сравнить, являются единственными значениями в стеке с плавающей запятой, тогда команда fcomi
сравнит значения и установит флаги CPU, чтобы можно было использовать инструкции 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
однако, кажется, работает хорошо.
Что я делаю неправильно?
PS: fcomip выдает только одно значение или оба?