我做了一个嵌套循环,试图找到1 ... 400的复合数,然后将它们保存到数组中。不幸的是,它没有那么好。有人可以帮帮我吗?
UPPER_LIMIT equ 400
.data
CoArray DWORD 500 DUP(?)
在进行函数调用之前,在array
中推送main
的偏移量:
main PROC
push OFFSET CoArray
call calc
main ENDP
这就是程序本身:
calc PROC
push ebp ; Save base pointer
mov ebp, esp ; Base of stack frame
mov esi,[ebp + 8] ; offset of the array
; esi now holds offset of the array
mov ecx, 4
L1:
cmp ecx, UPPER_LIMIT
jnle done
mov ebx, 2
L2:
mov edx, ecx
sub edx, 1
cmp ebx, edx
jge loopOne
mov eax, ecx
cdq
div ebx
cmp edx, 0
je composite
resume:
inc ebx
jmp L2
loopOne:
inc ecx
jmp L1
done:
pop ebp
ret 4
composite:
mov [esi], ecx ; Add the number to the array and increment esi
add esi, TYPE DWORD
jmp resume
calc ENDP
我应该提到它要求用户输入范围(1到400)中的整数并将其存储在变量中。但是,当我输入10时,程序立即终止。但是,如果我输入20或更高,它会挂断。很奇怪。
答案 0 :(得分:0)
您的代码存在一个大问题,但它不依赖于任何类型的用户输入,因此它不会导致您在问题结尾处描述的问题。我将假设该段落无关紧要,并描述了您尚未发布的不同版本的代码。
问题是,一旦你的代码找到一个复合数字,它就不会转移到下一个可能的复合数字。将复合数放入数组后,您的代码将继续查找已确定为复合数的更多除数。这意味着复合数将被多次放置在数组中,除了1和它本身之外的每个除数一次。要解决此问题,只需在程序结束时将jmp resume
语句转换为loopOne
。