我是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'
答案 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)。任何主要因素都必须按此顺序排列。