我怎样才能找到为什么我的装配质数计划无效?

时间:2018-03-26 02:52:45

标签: assembly x86

我是x86程序集的初学者。下面是我的素数计划的代码 - 到目前为止。此代码不输出' 0' 0因为它应该是非素数 - 然而它输出' 1'对于所有数字。任何帮助将非常感激。 程序应该是输出' 1'如果用户输入素数并输出' 0' 0如果用户输入不是素数。

我的第一个x86程序一直很难阅读和深刻理解。如何更深入地了解代码,并能够更好地了解代码的运行方式?我确实知道所有指令的含义,但在这段冗长的代码中并不是那么好。

format PE console
entry start


include 'win32a.inc'

section '.text' code readable executable
start:

;using eax,ebx,ecx,edx,esi

    call    read_hex
;Move user input into ecx for use in the countdown Loop
    mov     ecx,eax

coundown:
    ;countdown for the division circuit of user's input 
    dec     ecx
    jz      print_zero
    mov     esi,ecx
    sub     esi,2
    jz      print_zero
    jnz     check


check:
    ;loop of division circuit(for dividing 'user input' by all the numbers from 1 to the input value.)
    mov     edx,0
    div     ecx
    mov     ebx,0
    sub     ebx,edx
    jnc     print_one
    jz      print_zero
    jmp     countdown

print_zero:
    mov     eax,0
    call    print_eax
    jmp     outside

print_one:
    mov     eax,1
    call    print_eax

outside:

  ; Exit the process:
    push    0
    call    [ExitProcess]

include 'training.inc'

1 个答案:

答案 0 :(得分:0)

一个问题是decrement标签似乎调用了一些你没有提供的代码,而不是注释所说的应该是循环的顶部。您可能打算跳回check。还有很多其他的:如果你解决了这个问题,你现在会在递减值达到0时停止。但是,这意味着你将试验除以1,发现1确实是一个因素,所有数字都会错误地看起来像是复合的。如果你解决了这个问题,我很确定你不是故意以countdown的方式编写测试,但我不知道它应该做什么。

我不确定您是否对提高效率的建议感兴趣。如果没有,请跳过本文的其余部分。一个简单的方法是使用这样的定理:当 i × i >时,任何复合数都至少有一个小于其平方根的因子来计数并停止计数。 名词的。此外,您可以通过跟踪 i i ²并使用公式( i +)更新它来强化减少此乘法。 2)²=i²+(4· i + 4)。另一个快速改进是使用中国剩余定理来表明任何与0,2,3或4(mod 6)一致的数是复合的,所以在测试5之后,你可以在添加2之间交替(以获得下一个数字一致到1)并添加4(使下一个数字一致到5)。任何主要因素都必须按此顺序排列。