0

我正在 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,并且程序的输出告诉它不是素数。

谁能让我知道我做错了什么

4

2 回答 2

2

您需要edx在每次除法之前归零。的被除数div作为双寄存器操作数出现在edx:eax.

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

此外,最好将您的红利存储在寄存器中(ecx, esi,edi仍未使用)或至少存储在堆栈中,然后存储在内存中,正如迈克尔指出的那样,这不足以存储双字。

于 2013-06-26T12:58:59.300 回答
2

我看到这至少有两个问题:

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

您只为一个字节保留空间,b但存储一个 dword(4 个字节)。您应该使用dd而不是db.


div ebx 

您应该在之前使用cdq(或xor edx,edxdiv以清除edx,因为此除法将edx:eax除以ebx

于 2013-06-26T13:00:48.120 回答