Asm等同于delphi程序

时间:2017-04-20 08:32:48

标签: delphi assembly x86-64

我有一个名为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;

这会有用吗?

1 个答案:

答案 0 :(得分:8)

  

这会有用吗?

否则这不起作用,因为浮点比较与二进制比较不同。例如,0-0具有不同的位模式,但比较相同。同样,NaN比较不等于所有值,包括具有相同位模式的NaN

解决如何编写代码的最简单方法是让编译器编译Pascal代码,并检查生成的汇编代码。

一些旁白:

  • 无论如何,你的功能毫无意义,因为它没有返回值,也没有副作用。
  • 如果性能足以编写汇编程序,那么你应该编写纯汇编函数,而不是Pascal函数中的内联asm块。在任何情况下,x64编译器都不支持。
  • 您的参数已经在寄存器中,因此将它们复制到其他寄存器是没有意义的。对于x86代码,A到达EAXB到达EDX。鉴于EAX已包含A,为什么要将其复制到EAX?它已经存在了。 B已经在EDX,为什么要将其复制到ECX?对于x64代码,这两个参数在浮点寄存器中传递,并且可以直接在那里进行比较。一旦开始编写汇编程序,就需要了解调用约定的寄存器使用。
  • 你的jne毫无意义。如果执行没有跳转,那么它将移动到下一行代码。这就是你跳到的地方。