gpt4 book ai didi

assembly - 帮助改进一个简单的汇编函数

转载 作者:行者123 更新时间:2023-12-04 16:49:50 25 4
gpt4 key购买 nike

我刚刚在作业中交了这个功能。它完成了(因此没有家庭作业标签)。但我想看看如何改进。

本质上,该函数使用以下公式对 1 和给定数字之间的所有整数的平方求和:

n(n+1)(2n+1)/6

哪里 n是最大数量。

下面的函数用于捕获任何溢出并在发生任何溢出时返回 0。
UInt32 sumSquares(const UInt32 number)
{
int result = 0;
__asm
{
mov eax, number //move number in eax
mov edx, 2 //move 2 in edx
mul edx //multiply (2n)
jo end //jump to end if overflow
add eax, 1 //addition (2n+1)
jo end //jump to end if overflow
mov ecx, eax //move (2n+1) in ecx

mov ebx, number //move number in ebx
add ebx, 1 //addition (n+1)
jo end //jump to end if overflow

mov eax, number //move number in eax for multiplication
mul ebx //multiply n(n+1)
jo end //jump to end if overflow
mul ecx //multiply n(n+1)(2n+1)
jo end //jump to end if overflow
mov ebx, 6 //move 6 in ebx
div ebx //divide by 6, the result will be in eax

mov result, eax //move eax in result

end:
}

return result;
}

基本上,我想知道我可以在那里改进什么。主要是在最佳实践方面。一件事听起来很明显:更智能的溢出检查(对任何会导致溢出的最大输入进行一次检查)。

最佳答案

    mov eax, number  //move number in eax
mov ecx, eax //dup in ecx
mul ecx //multiply (n*n)
jo end //jump to end if overflow
add eax, ecx //addition (n*n+n); can't overflow
add ecx, ecx //addition (2n); can't overflow
add ecx, 1 //addition (2n+1); can't overflow
mul ecx //multiply (n*n+n)(2n+1)
jo end //jump to end if overflow
mov ecx, 6 //move 6 in ebx
div ecx //divide by 6, the result will be in eax

mov result, eax //move eax in result

强度减少:加而不是乘。

通过分析,更少的溢出检查(您可以按照您的描述做得更好)。

将值保存在寄存器中,而不是返回到堆栈上的参数。

仔细选择寄存器,这样可以重用的值就不会被覆盖。

关于assembly - 帮助改进一个简单的汇编函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2649689/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com