2014-03-18 40 views
0

我在nasm程序中實施,可以檢測提供的質數。在nasm中查找質數

xor rax,rax; 
    mov eax, 6 ; 
    mov ecx, 1  ; 
loop: 
    cmp  ecx, 6  
    jbe  end_loop ; ecx >= bufor 

    xor edx ,edx ; 
    mov eax, 6 
    div ecx   ; div dla edi 

    cmp edx, 0 
    je not_prime 

    inc  ecx    ; i++ 
    jmp  loop_for 

這是一個簡單的算法,檢查天氣6是素數,但它失敗。它檢查edx寄存器中的div提醒。它始終在end_loop(但它應該在not_prime)指令結束,所以程序說6是一個素數,但它不是。有人能告訴我如何解決它嗎?我沒有任何線索。

+1

你是否確定edx中什麼是當你期望它爲0? –

+0

據我所知edx = eax mod ecx? – RMachnik

+1

我們知道它可以被1整除1.從2開始我們可以通過執行'test eax,1'來確定一個值是否可以被2整除......但是......採取小步驟,從2開始。 –

回答

3

該代碼是不正確:

mov ecx, 1  ; 
loop: 
    cmp  ecx, 6  
    jbe  end_loop ; ecx >= bufor 

jbejump if below or equal裝置。所以你在這裏做本質上是:

ecx = 1; 
do { 
    if (ecx <= 6) goto end_loop; 

顯然1是< = 6,因此會一直跳到end_loop在循環的第一次迭代。
該跳轉應該可能是jae


另一個問題是,你開始ecx = 1,因爲ecx似乎是你的除數。如果你檢查素數,你應該嘗試除以的第一個​​數字是2,而不是1.

+0

所以應該有jae和ecx應該從2開始,謝謝! – RMachnik