嵌套循环给出错误assembly / x86 / MASM

时间:2015-05-08 00:49:59

标签: assembly x86 masm

我做了一个嵌套循环,试图找到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或更高,它会挂断。很奇怪。

1 个答案:

答案 0 :(得分:0)

您的代码存在一个大问题,但它不依赖于任何类型的用户输入,因此它不会导致您在问题结尾处描述的问题。我将假设该段落无关紧要,并描述了您尚未发布的不同版本的代码。

问题是,一旦你的代码找到一个复合数字,它就不会转移到下一个可能的复合数字。将复合数放入数组后,您的代码将继续查找已确定为复合数的更多除数。这意味着复合数将被多次放置在数组中,除了1和它本身之外的每个除数一次。要解决此问题,只需在程序结束时将jmp resume语句转换为loopOne