这是我的任务。
我已经为这个程序集编写了代码,但是有什么方法可以使转换速度更快?
提前感谢您的任何帮助;D

//Convert this nested for loop to assembly instructions
    for (a = 0; a < y; a++)
        for (b = 0; b < y; b++)
            for (c = 0; c < y; c++)
                if ((a + 2 * b - 8 * c) == y)
                    count++;

convert
    _asm {
                mov ecx,0
                mov ax, 0
                mov bx, 0
                mov cx, 0

                Back:
                push cx
                push bx
                push ax
                add bx, bx
                mov dx, 8
                mul dx
                add cx, bx
                sub cx, ax
                pop ax
                pop bx
                cmp cx, y
                jne increase
                inc count
                increase : pop cx
                          inc ax
                           cmp ax, y
                           jl Back

                           inc bx
                           mov ax, 0
                           cmp bx, y
                           jl Back

                           inc cx
                           mov ax, 0
                           mov bx, 0
                           cmp cx, y
                           jl Back

        }

最佳答案

一些通用的技巧:

  • 让你的循环计数器倒数而不是倒数。您可以通过这种方式消除比较。
  • 了解 LEA 的神奇之处,它可以计算包含加法和按 2 的特定幂进行缩放的表达式。在任何地方都不需要 MUL
  • 提升内循环外的循环不变性工作。 a + 2*b 对于 c 循环的每次迭代都是常数。
  • 使用 SIDI 来保存值。这应该可以帮助您避免所有那些 pushpop 指令。
  • 如果您的值适合 8 位,请使用 AHAL 等以更有效地利用您的寄存器。

  • 哦,在 mov ax, 0 之后你不需要那个 inc cx ,因为 AX 已经是 0 了。

    特定于该算法:如果 y 为奇数,则跳过 a 为偶数的迭代,反之亦然。近 2 倍的加速等待着......(如果你想知道为什么,用铅笔和纸计算。)提示:你也不需要测试每一次迭代。如果您足够聪明,您可以简单地按 2 秒进行操作。

    或者更好的是,制定一个封闭的表格,让您可以直接计算答案。 ;-)

    关于C++转汇编语言,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20257314/

    10-11 16:33