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

    技术2022-07-10  106

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

    题目要求运行截图 编程平台代码实现

    题目要求

    简化的歌德巴赫猜想:任何一个大于或等于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

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

    Processed: 0.096, SQL: 9