汇编语言:验证简化的歌德巴赫猜想
题目要求运行截图
编程平台代码实现
题目要求
简化的歌德巴赫猜想:任何一个大于或等于6的偶数均可以表示为两个素数之和。现从键盘输入一个0~65535之间的无符号整数,试验证歌德巴赫猜想。 举例: (1)输入数12,输出:12=5+7 (2)输入数20,输出:20=3+17 20=7+13 (3)输入数7,输出:Must be even! (4)输入数3,输出:Must be greater than or equal to 6!
运行截图
编程平台
Masm for Windows 集成实验环境 2012.5
代码实现
DATAS SEGMENT
data DW 0
hint DB
'Enter an unsigned integer between 0 and 65535: $'
smallerror DB 13
,10
,'Must be greater than or equal to 6!$'
odderror DB 13
,10
,'Must be even!$'
scale DW 10
DATAS ENDS
STACKS SEGMENT STACK
DB 200H DUP
(?
)
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES
,DS:DATAS
,SS:STACKS
MAIN PROC
MOV AX
,DATAS
MOV DS
,AX
LEA DX
,hint
MOV AH
,9H
INT 21H
LEA
SI,data
MOV DI
,5
;输入的字符个数
l:
MOV AH
,1H
;输入一个字符
INT 21H
CMP AL
,0DH
JE n
CALL TRANS
;将输入的数字样式不变地放在十六进制中
MOV AH
,0
MOV BX
,AX
MOV AX
,[SI]
MOV DX
,0AH
MUL DX
;将已存入的数据乘以10D即0AH
ADD AX
,BX
MOV
[SI],AX
DEC DI
CMP DI
,0
JNE l
MOV DL
,0DH
MOV AH
,2H
INT 21H
MOV DL
,0AH
MOV AH
,2H
INT 21H
n:
MOV AX
,data
CMP AX
,6
;是否小于6
JB serr
PUSH AX
MOV DX
,0
MOV BX
,2
DIV BX
CMP DX
,0
;是否为偶数
JNE oerr
POP AX
MOV CX
,AX
SHR CX
,1
;CX存放数值的一半
PUSH AX
MOV AX
,CX
MOV DX
,0
MOV BX
,2
DIV BX
CMP DX
,0
;CX是否为偶数
JE ro
INC CX
ro:
POP AX
MOV
SI,1
;循环寻找两个加数都为素数的情况,有则立即输出
rl:
MOV BX
,SI
PUSH AX
CALL PRIME
;素数检查
POP AX
CMP DI
,1
;是否为素数
JNE rn
MOV BX
,AX
SUB BX
,SI;BX存储
((AX
)-(SI))
PUSH AX
PUSH
SI
CALL PRIME
;素数检查
POP
SI
POP AX
CMP DI
,1
;是否为素数
JNE rn
PUSH AX
PUSH BX
PUSH
SI
CALL OUTPUTDATA
;输出数值
POP
SI
MOV DL
,'='
MOV AH
,2H
INT 21H
MOV AX
,SI
PUSH
SI
CALL OUTPUTDATA
;输出数值
POP
SI
MOV DL
,'+'
MOV AH
,2H
INT 21H
POP AX
PUSH
SI
CALL OUTPUTDATA
;输出数值
POP
SI
MOV DL
,0DH
;回车
MOV AH
,2H
INT 21H
MOV DL
,0AH
;换行
MOV AH
,2H
INT 21H
POP AX
rn:
INC
SI
CMP
SI,CX
JNE rl
JMP f
serr:
LEA DX
,smallerror
;输入数字过小提示
MOV AH
,9H
INT 21H
JMP f
oerr:
LEA DX
,odderror
;输入偶数提示
MOV AH
,9H
INT 21H
f:
MOV AH
,4CH
INT 21H
MAIN ENDP
;子程序
;功能:让十进制数字样式不变地放在十六进制中,如将10D变成10H。
;入口参数:AL存放输入的数据。
TRANS PROC
;判断是否为数字
CMP AL
,30H
JB stop
CMP AL
,39H
JG upper
SUB AL
,30H
JMP stop
;判断是否为大写字母(A
-F)
upper:
CMP AL
,41H
JB stop
CMP AL
,46H
JG lower
SUB AL
,37H
JMP stop
;判断是否为小写字母(a
-f)
lower:
CMP AL
,61H
JB stop
CMP AL
,66H
JG stop
SUB AL
,57H
stop:
RET
TRANS ENDP
;子程序
;功能:用scale进制形式输出正负数值。
;入口参数:AX存放要输出的数值,scale存放要转换的进制。
OUTPUTDATA PROC
MOV BX
,scale
MOV
SI,0
;记录输出的位数
lop1:
MOV DX
,0
DIV BX
PUSH DX
;余数入栈
INC
SI
CMP AX
,0
;也可以写成OR AX
,AX
JNE lop1
lop2:
POP DX
ADD DL
,30H
;转换成对应的ASCII码
MOV AH
,2
INT 21h
DEC
SI
CMP
SI,0
JNE lop2
RET
OUTPUTDATA ENDP
;子程序
;功能:测试一个数是否为素数,是则将DI置为1,否则为0。
;入口参数:BX存放要测试的数。
PRIME PROC
CMP BX
,1
JBE pn
;1不是素数
CMP BX
,2
JE pt
;2是素数
;循环将BX的值依次除以2到
(BX
)-1,都不能整除说明为素数
MOV DI
,2
;存放除数
pl:
MOV AX
,BX
MOV DX
,0
DIV DI
CMP DX
,0
JE pn
INC DI
CMP DI
,BX
JNE pl
pt:
MOV DI
,1
;表示BX存放的数为素数
JMP pf
pn:
MOV DI
,0
;表示BX存放的数不为素数
pf:
RET
PRIME ENDP
CODES ENDS
END MAIN
如果文章内容出错或者您有更好的解决方法,欢迎到评论区指正和讨论!