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

求整数[2,n-1]范围内因数个数的汇编代码错误排查求助

问题描述

给定一个不超过1000的非负整数n,计算该数在区间[2, n-1]内的因数个数,输入为非负整数,输出为非负整数。

我编写了一段汇编代码,但无法得到正确结果,代码如下:

%include"io.inc"
section .text
global CMAIN
CMAIN:
    ;write your code here
    GET_UDEC 4, eax
    mov ebx, 2
    mov ecx, 0
 cycle:
    cmp eax, ebx
    jbe end;
    xor edx, edx
    div ebx
    mul eax, ebx
    inc ebx
    cmp edx, 0
    jne cycle;
    inc ecx;
    jmp cycle;
 end:
    PRINT_UDEC 4, ecx
    NEWLINE
    
    xor eax, eax
    ret

请问我的代码存在什么问题?请帮忙指出。


代码错误分析
  • div指令破坏原数且恢复逻辑完全错误:div ebx执行后,eax会被替换为除法的商,而你试图用mul eax, ebx恢复原数是错误的——x86架构中mul是单操作数指令,mul ebx实际是将当前eax与ebx相乘,结果存入edx:eax,根本无法还原最初输入的n值。原数丢失后,后续循环的边界判断和因数计算全部失效。
  • 循环边界判断逻辑错误:当前cmp eax, ebx后jbe end的逻辑,会在ebx等于n-1时直接跳出循环,漏掉了对n-1这个边界值是否为因数的判断。正确的边界应该是当ebx >= n时才结束循环,所以应将判断改为cmp ebx, eax,然后用jge end跳转。
  • 冗余跳转逻辑(非核心但可优化):在判断edx != 0时jne cycle,之后如果是因数则inc ecx再jmp cycle,其实可以合并跳转逻辑,但这不是导致结果错误的核心原因。

内容的提问来源于stack exchange,提问作者jie

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 15:27:48