求整数[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
相关产品推荐
相关产品推荐

