这是我的任务。
我已经为这个程序集编写了代码,但是有什么方法可以使转换速度更快?
提前感谢您的任何帮助;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 循环的每次迭代都是常数。 SI
、 DI
来保存值。这应该可以帮助您避免所有那些 push
和 pop
指令。 AH
、 AL
等以更有效地利用您的寄存器。 哦,在
mov ax, 0
之后你不需要那个 inc cx
,因为 AX
已经是 0 了。特定于该算法:如果
y
为奇数,则跳过 a
为偶数的迭代,反之亦然。近 2 倍的加速等待着......(如果你想知道为什么,用铅笔和纸计算。)提示:你也不需要测试每一次迭代。如果您足够聪明,您可以简单地按 2 秒进行操作。或者更好的是,制定一个封闭的表格,让您可以直接计算答案。 ;-)
关于C++转汇编语言,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20257314/