编写1²+2²+…+N²计算的汇编程序:代码终止及思路疑问
汇编实现1²+2²+…+N²的平方和:问题分析与修正
当前代码的问题
- 逻辑偏离需求:代码中用
mul eax, ebx(ebx固定为2),实际是计算1×2 + 2×2 + ...,并非目标的平方和(平方应为自身相乘)。 - 终止条件完全错误:
jz ready是当eax为0时跳转,但代码先xor eax,eax再inc eax,eax初始值为1,永远不会触发该跳转;jl again是有符号数小于时跳转,eax持续递增,永远不会满足条件,会导致无限循环。
- 未使用变量N:整个代码未处理题目要求的非负字变量N,完全没有体现“循环到N”的核心逻辑。
正确实现思路
要计算到N²后停止,核心是用N作为循环的终止判断条件,步骤如下:
- 初始化累加寄存器(如ecx)为0,用于存储平方和;
- 将变量N加载到某个寄存器(如edx),作为循环上限;
- 初始化计数寄存器(如esi)为0,每次循环递增1,代表当前要计算平方的数;
- 计算当前数的平方:通过
mul指令实现自身相乘(单操作数mul会让eax与自身相乘,结果低32位存在eax中); - 将平方值加到累加寄存器中;
- 判断当前计数是否等于N,若等于则跳出循环,否则继续执行。
修正后的示例代码
.code main proc xor ecx, ecx ; ecx = 0,平方和初始化为0 mov esi, 0 ; esi作为计数变量,从0开始 mov edx, N ; 加载非负字变量N到edx,作为循环上限 Again: inc esi ; 计数+1,此时esi为当前要计算平方的数(1、2…N) mov eax, esi ; 将当前数传入eax,用于计算平方 mul eax ; eax = eax * eax = esi²(完成平方计算) add ecx, eax ; 将当前平方值累加到总和ecx中 cmp esi, edx ; 判断当前计数是否达到N jl Again ; 若未达到,继续循环 Ready: ; 此时ecx中存储的就是1²+2²+…+N²的结果 ret main endp end main
关键细节说明
- 用
esi单独存储计数,避免mul操作覆盖计数变量(mul eax会改写eax的值); - 终止条件通过
cmp esi, edx比较计数与N,jl Again表示当计数小于N时继续循环,等于N时自动跳出; - 若使用16位汇编(因题目提到N是字变量),只需将寄存器替换为
ax、cx、dx、si,逻辑保持一致即可。
内容的提问来源于stack exchange,提问作者Kimberly Goods
相关产品推荐
相关产品推荐

