欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

汇编语言:验证简化的歌德巴赫猜想

程序员文章站 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

如果文章内容出错或者您有更好的解决方法,欢迎到评论区指正和讨论!

相关标签: 汇编语言 汇编