【发布时间】:2017-09-16 18:36:31
【问题描述】:
我有一个名为 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;
这行得通吗?
【问题讨论】:
-
这样做的目的是什么?你测试过你的代码吗?有效吗?
-
程序 != 函数。您的任何代码都没有任何意义。另请注意,此处的参数是按值传递的(即传递了一个副本)。您对参数所做的任何更改都不会离开程序。如果您希望这种情况发生,您需要有
var参数。请获取marcocantu.com/objectpascalhandbook 或类似的副本。 -
为什么要转asm?这是糟糕的 Delphi 代码(即使你修复了错误),而且在 asm 中会更糟!退一步想想你在做什么:1)如果A和B不同:你做一个比较和一个分配。 2)如果A和B相同:您进行比较和跳转。 即两种情况下都有 2 次操作 但是如果你想让 A 和 B 一样,那么简单地分配
A := B;是一个单个操作。因此,您的方法不会获得任何性能优势 - 由于您没有考虑到浮点的细微差别,您只会产生意外行为的可能性。 -
老实说,如果您将其中一个设置为与另一个不相同的情况下相等,那么始终将 A 设置为 B 不是更容易吗?
-
在跨平台语言中使用 asm 是个坏主意。因为这个 asm 部分只能在 x86 上工作,在 x64、Android (ARM)、MacOS (x64) 和 iOS (ARM) 上都不能工作。