汇编中的素数程序出现问题

时间:2013-06-26 12:51:09

标签: assembly x86

我正在学习x86上的汇编语言并做了一个简单的程序,它会告诉数字是否为素数。

我认为我做得对,但仍然没有得到理想的结果,下面是代码

section .bss
b db
section .data
x db "Number is Prime",10,0
y db "Number is not Prime",10,0
z db "value is=%d",10,0

section .text
global main
extern printf
main:
mov eax,17
mov ebx,2
loop:
mov [b],eax
div ebx
mov eax,[b]
cmp edx,0
jz Print_not_Prime
inc ebx

 cmp ebx,17
 jnz loop
 push x
 call printf
 add esp,4
 ret

 Print_not_Prime:
 push y
 call printf
 add esp,4
 ret

在上面的代码中,我正在检查数字17和programe的输出,告诉它不是素数。

有人能让我知道我做错了吗

2 个答案:

答案 0 :(得分:2)

在每次除法之前,您需要将edx归零。 div的红利是edx:eax中的双重注册操作数。

如果你在上一个试验部门有剩余部分,那么它会搞砸你的结果。

最好将你的红利存储在一个寄存器中(ecxesiedi仍未使用)或者至少在堆栈中然后存储在内存中,正如迈克尔所指出的那样不足以存储dword。

答案 1 :(得分:2)

我至少看到两个问题:

b db
....
mov [b],eax

您只需在b保留一个字节的空间,但存储一个双字(4个字节)。您应该使用dd代替db


div ebx 

您应该在cdq之前使用xor edx,edx(或div)来清除edx,因为此除法会将edx:eax除以{{1} }}