首頁>Program>source

我編寫了一个程式,该程式从1開始递增,以檢查100以下的每个數字,如果為質數,该數字將儲存到陣列中.但是,我遇到的問题是什麼都没有儲存到陣列中,並且没有按預期利用寄存器.就其本身而言," _ isPrime"過程完全可以按預期執行,但是当我將其与主代碼一起拼凑在一起時,可以將其稱為多數民众赞成在哪裏出現錯誤.主迴圈是否正確實現了我的迴圈? 我在该程式中還有什麼要做的?

.DATA
arr DWORD 27 DUP (?)
.CODE           
_MainProc   PROC
        mov eax, 1      ; number in eax will be prime checked / edx will be 1 if true
J1:     
        mov edx, 0      ; clear edx 
        inc eax         ; increment eax to begin prime checking
        cmp eax, 100    ; if eax reaches 100 loop ends
        je J2
        push eax
        push edx
        call _isPrime   ; prime check on eax
        cmp  edx, 0     ; if not prime begin loop again
        je J1
        mov [arr], eax  ; if prime eax is stored into array
        jmp J1          ; loop begins again
 
J2:
      
    mov     eax, 0
    ret
_MainProc   ENDP
_isPrime PROC 
        push ebp 
        mov  ebp, esp 
        push ecx
        push ebx
        cmp     eax,1
        jle     L2
        mov     ecx,eax
        shr     ecx,1
        mov     ebx,2
        mov     edx,1
L1:
        cmp     ebx,ecx
        jg      L2
        push    eax
        mov     edx,0
        div     ebx
        cmp     edx,0
        je      L2
        inc     ebx
        jmp     L1
        mov     edx,1
L2:
                      
        pop ebx
        pop ecx
        pop ebp
        ret
_isPrime ENDP            
END  
最新回復
  • 12天前
    1 #

     
      push eax
       push edx
       call _isPrime   ; prime check on eax
    

    您不需要提供此 EDX 引數._isPrime過程不將其用作引數。
    接下来,您需要平衡堆棧.您可以選擇使用 ret 4从proc返迴 跳出唯一的論點 EAX 至少提供proc使用 mov eax, [ebp + 8]這樣的指令来获取它 ...

     
      mov [arr], eax  ; if prime eax is stored into array
       jmp J1          ; loop begins again
    

    您將把每个素數儲存在另一个素數上!

       mov edi, offset arr
        ...
        mov [edi], eax
        add edi, 4
        jmp J1
    

    這可能有效。


     
     push    eax
      mov     edx,0
      div     ebx
      cmp     edx,0
      je      L2
    

    _isPrime中,您無法在 EAX中保留值 因為 pop eax 丢失了!

    push    eax       ; (1)
    xor     edx, edx
    div     ebx
    pop     eax       ; (1)
    test    edx, edx
    jz      L2
    

    為了正確操作飞龙 指令需要去 mov edx, 1 迴圈而不是 in 迴圈:

    before
    
    L1: mov edx,1 cmp ebx,ecx jg L2

  • vba:包含SUM的Excel IF語句
  • PHP / Apache的記憶體上限