我有一个名为SetCompare的简单delphi函数,用于比较两个单例,如果它们不相等,则将一个值设置为另一个。
procedure SetCompare( A : single; B : single );
begin
if( A <> B ) then
A := B;
end;
我试图将其转换为asm:
procedure SetCompare( A : Single; B : Single ); register;
begin
asm
mov EAX,A
mov ECX,B
cmp EAX,ECX
jne SetValue
@SetValue:
mov EAX,ECX
end;
end;
这会有用吗?
答案 0 :(得分:8)
这会有用吗?
否则这不起作用,因为浮点比较与二进制比较不同。例如,0
和-0
具有不同的位模式,但比较相同。同样,NaN
比较不等于所有值,包括具有相同位模式的NaN
。
解决如何编写代码的最简单方法是让编译器编译Pascal代码,并检查生成的汇编代码。
一些旁白:
asm
块。在任何情况下,x64编译器都不支持。A
到达EAX
,B
到达EDX
。鉴于EAX
已包含A
,为什么要将其复制到EAX
?它已经存在了。 B
已经在EDX
,为什么要将其复制到ECX
?对于x64代码,这两个参数在浮点寄存器中传递,并且可以直接在那里进行比较。一旦开始编写汇编程序,就需要了解调用约定的寄存器使用。jne
毫无意义。如果执行没有跳转,那么它将移动到下一行代码。这就是你跳到的地方。