我是汇编语言的新手。我编写了一个程序,用于获取输入,然后显示该数字是否为素数。
这是我的源代码。
.intel_syntax noprefix
.include "console.i"
.data
Num: .long 0
.text
ask: .asciz "Enter a +ve number : "
ansp: .asciz " is prime."
ans: .asciz " is not prime."
_entry:
Prompt ask
GetInt Num
mov eax,Num # store Number in eax
#mov ecx,0 # Reset ecx to 0
mov ecx,0 # Reset ecx t0 2 for dividing.
cdq
1: inc ecx # increment ecx
mov ebx,eax #backup eax
Div ecx #Divide eax by ecx
cmp edx,0 #if remainder is zero num is not prime
je 2f
mov edx,0 #reset edx to 0
mov eax,ebx #reset eax to Num
cmp eax,ecx if ecx is less than number.
jl 1b
#Prime
PutInt Num
Prompt ansp
jmp 3f
2: #Not Prime
PutInt Num
Prompt ans
3: PutEol
ret
.global _entry
.end
当我运行程序时,它总是显示它不是素数。
例如,如果我输入7,则显示 7不是素数。
我正在使用英特尔x86架构并在Ubuntu上开发它。
编辑1:根据Darron,我将ecx寄存器初始化为1,然后将ecx递增为1,以便从2开始循环。
但问题是,当我输入9时,它显示我9是素数。我不知道我的逻辑有什么问题。
编辑2:我将我的号码存储在eax中,然后我将其除以ecx,然后最后检查edx寄存器中的reaminder是否为零。
感谢。
答案 0 :(得分:8)
首先除以1.即使素数也可以被1整除。
答案 1 :(得分:3)
我使用gdb(GNU Project Debugger)解决了我的问题。
在我的逻辑中,我将数字除以给定数字,例如,如果我输入15,逻辑将数字除以15,但对于素数,我们必须除以数字-1,即(15-1) )。
这是我更新的循环块。
1: inc ecx
mov eax,ebx
Div ecx
cmp edx,r
je 2f
mov edx,0
mov eax,ebx
Sub eax,1
cmp ecx,eax
jl 1b