我正在学习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的输出,告诉它不是素数。
有人能让我知道我做错了吗
答案 0 :(得分:2)
在每次除法之前,您需要将edx
归零。 div
的红利是edx:eax
中的双重注册操作数。
如果你在上一个试验部门有剩余部分,那么它会搞砸你的结果。
最好将你的红利存储在一个寄存器中(ecx
,esi
,edi
仍未使用)或者至少在堆栈中然后存储在内存中,正如迈克尔所指出的那样不足以存储dword。
答案 1 :(得分:2)
我至少看到两个问题:
b db
....
mov [b],eax
您只需在b
保留一个字节的空间,但存储一个双字(4个字节)。您应该使用dd
代替db
。
div ebx
您应该在cdq
之前使用xor edx,edx
(或div
)来清除edx
,因为此除法会将edx:eax
除以{{1} }}