使用x86 assembler: floating point compare处的示例,我编写了以下NASM代码,该代码比较两个双精度数并选择两个中较小的一个:
fld qword[a]
fld qword[b]
fcomip
fstp qword [float_temp_var] ; to clear stack
jge minmax1_next
movsd xmm0,[b]
movsd [minval],xmm0
jmp minmax1_out
minmax1_next:
movsd xmm0,[a]
movsd [minval],xmm0
minmax1_out:
唯一的问题是结果不一致。有时它会正确识别较小的值,有时则不会。根据上面网址上的帖子,我不需要存储或弹出标志寄存器,所以我不知道我做错了什么。研究尚未揭示问题。
答案 0 :(得分:0)
你需要使用jae而不是jge。有关这两条说明之间的区别,请参阅此问题Difference between JA and JG in assembly。尽管浮点比较已签名,但它以与无符号比较相同的方式设置标志,因此您需要使用无符号分支指令。