You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

编写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作为循环的终止判断条件,步骤如下:

  1. 初始化累加寄存器(如ecx)为0,用于存储平方和;
  2. 将变量N加载到某个寄存器(如edx),作为循环上限;
  3. 初始化计数寄存器(如esi)为0,每次循环递增1,代表当前要计算平方的数;
  4. 计算当前数的平方:通过mul指令实现自身相乘(单操作数mul会让eax与自身相乘,结果低32位存在eax中);
  5. 将平方值加到累加寄存器中;
  6. 判断当前计数是否等于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 10:15:34