题目:
编写一个程序,提示用户输入一个数字,然后显示信息说明该数字是否是素数。素数(Prime)是只能被自身和1整除的自然数。
(1)采用直接简单的算法:假设输入N,将其逐个除以2~N-1,只要能整除(余数为0)说明不是素数,只有都不能整除才是素数。
(2)采用只对奇数整除的算法:1、2和3是素数,所有大于3的偶数不是素数,从5开始的数字只要除以从3开始的奇数,只有都不能整除才是素数。
第一问:
;素数的判断程序
; eg0000.asm in Windows Console
include io32.inc
.data
msg byte 13,10,'this number is one prime',0
mmsg byte 13,10,'this number is not a prime',0;做出必要的提示说明
var dword ?
; 数据定义
.code
start:
call readuid;素数的判断只是针对无符号数进行的,所以我们这里面要调用指令来进行无符号数的输入
cmp eax,3;首先小于等于三的数都是素数
jbe doney
cdq;该指令的作用是将edx的最高位设置到edx每一位上
mov esi,eax;将eax的值先赋给esi,因为做过出发运算之后需要我们将eax的值进行恢复
mov edi,edx;将我们的扩展位赋值给edi和前面的原理是一样的都是为了除法运算之后进行数据的恢复
mov ebx,2;我们从2开始向后判断
again:
div ebx;调用div指令进行除法的运算
test edx,edx;因为edx中保存的是我们的余数,可以使用text来检验最终除法运算的余数是不是零
jz donen;如果是0的话代表有因子所以不是素数,结束循环
inc ebx;增加1来继续进行判断
cmp ebx,esi;结束循环的条件
mov eax,esi;数值恢复
mov edx,edi;数值恢复
jb again
doney:;下面都是一些提示信息的显示
mov eax,offset msg
call dispmsg
jmp done
donen:
mov eax,offset mmsg
call dispmsg
done:
exit 0
; 子程序
end start
第二问:
;素数的判断程序
; eg0000.asm in Windows Console
include io32.inc
.data
msg byte 13,10,'this number is one prime',0
mmsg byte 13,10,'this number is not a prime',0;做出必要的提示说明
var dword ?
; 数据定义
.code
start:
call readuid;素数的判断只是针对无符号数进行的,所以我们这里面要调用指令来进行无符号数的输入
cmp eax,3
jbe doney
cdq;该指令的作用是将edx的最高位设置到edx每一位上
mov esi,eax
mov edi,edx
mov ebx,3;和前一个程序不同的地方在此处,从三开始
again:
div ebx
test edx,edx
jz donen
add ebx,2;每次加2
cmp ebx,esi
mov eax,esi
mov edx,edi
jb again
doney:
mov eax,offset msg
call dispmsg
jmp done
donen:
mov eax,offset mmsg
call dispmsg
done:
exit 0
; 子程序
end start