2014-03-18 39 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