繁体   English   中英

将 C++ 中的 2 个变量与 asm 代码互换

[英]Interchange 2 variables in C++ with asm code

我有一个巨大的 function 对大量int数据进行排序。 该代码工作正常,除了它应该更慢的事实。 我解决这个问题的第一步是在C++中放置一些asm代码。 如何使用asm交换 2 个变量? 我试过这个:

_asm{ push a[x]; push a[y]; pop a[x]; pop a[y];}

和这个:

_asm(mov eax, a[x];mov ebx,a[y]; mov a[x],ebx; mov a[y],eax;}

但两者都崩溃了。 我怎样才能在这些交换上节省一些时间? 我使用 VS_2010

一般来说,用这样的简单代码很难比你的编译器做得更好。

编译器在面对整数交换操作时,通常会发出如下代码:

mov eax, [x]
mov ebx, [y]
mov [x], ebx
mov [y], eax

在尝试覆盖之前,首先检查编译器实际生成的内容。 如果是这样,请不要再费心了; 你将无法做得比这更好。 此外,如果您将其留给编译器,如果之后立即使用这些变量,它可能会选择重用这些寄存器之一以节省变量加载/存储。 这对于手工编码的组装是不可能的; 编译器必须在手工编码 asm 的黑盒之后重新加载变量。

请注意,push/push/pop/pop 序列可能要慢得多; 它不仅向堆栈添加了额外的四个 memory 操作,还引入了对堆栈指针的依赖关系,从而消除了任何流水线的可能性。 使用简单的mov序列,如果一对读取和一对写入位于不同的 memory 银行,或者一个在缓存中等,至少可以并行运行它们。它也不会在堆栈指针上引入停顿后面的代码。

因此,您不应该尝试对交换成本进行微优化; 相反,减少执行的交换次数 有许多可用的排序算法,每种算法的特性略有不同。 您可能会发现一些在您的数据集上比其他更好(导致交换更少)。

是什么让您认为您可以生成比优化编译器更快的程序集?
即使你让它正常工作,你可能实现的只是混淆优化器以产生更慢的代码。

您可以使用汇编代码中的变量名称、function 名称和标签作为符号。 请注意,像a[x]这样的东西不是这样有效的符号。

编写更高效的代码需要技能和知识,使用 asm 不一定能帮助你。

您可以将编译器为 function 生成的汇编代码与内联汇编器进行比较,而无需查看您在哪里破坏了它。

当您进行内联汇编时,您可以更改一些内容,以便编译器对寄存器内容所做的假设将不再成立。 通常 EAX 用于传递参数或返回值,因此丢弃 EAX 可能没有太大效果,但是您破坏了 EBX 并且没有将其放回原处,这可能会导致问题。 在使用之前尝试推动 EBX,然后在完成后将其弹出。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM