我想将以下代码中的 for 循环转换为汇编,但我不确定如何开始。我们将不胜感激解释如何执行此操作及其工作原理。
我正在使用 VS2010,C++,为 x86 编写。代码如下:
for (n = 0; norm2 < 4.0 && n < N; ++n)
{
__asm{
///a*a - b*b + x
fld a // a
fmul st(0), st(0) // aa
fld b // b aa
fmul st(0), st(0) // bb aa
fsub // (aa-bb) // st(0) - st(1)
fld x // x (aa-bb)
fadd // (aa-bb+x)
/// 2.0*a*b + y;
fld d // d (aa-bb+x)
fld a // d a (aa-bb+x)
fmul // ad (aa-bb+x)
fld b // b ad (aa-bb+x)
fmul // abd (aa-bb+x)
fld y // y adb (aa-bb+x)
fadd // b:(adb+y) a:(aa-bb+x)
fld st(0) //b b:(adb+y) a:(aa-bb+x)
fmul st(0), st(0) // bb b:(adb+y) a:(aa-bb+x)
fld st(2) // a bb b:(adb+y) a:(aa-bb+x)
fmul st(0), st(0) // aa bb b:(adb+y) a:(aa-bb+x)
fadd // aa+bb b:(adb+y) a:(aa-bb+x)
fstp norm2 // store aa+bb to norm2, st(0) is popped.
fstp b
fstp a
}
}
最佳答案
开始解决此类问题的最快捷、最简单的方法是首先以尽可能简单的形式用 C 或 C++ 编写代码,然后使用 C/C++ 编译器生成 asm。然后您可以使用这个生成的 asm 作为您自己的 asm 代码的模板。使用像 gcc 这样的合适的编译器,您可以使用 gcc -S
来执行此操作。我很确定 Visual Studio 在其 GUI 的某处隐藏了一个类似的选项(显然命令行开关是 /Fa
)。
关于c++ - 使用内嵌 asm 编写一个带有 2 个比较的 for 循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2817893/