汇编语言:验证简化的歌德巴赫猜想
程序员文章站
2022-06-07 09:08:19
...
题目要求
简化的歌德巴赫猜想:任何一个大于或等于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
如果文章内容出错或者您有更好的解决方法,欢迎到评论区指正和讨论!