我编写了一个8086汇编程序,该程序执行以下操作:
问题出在第三步,它有一个错误。 它说9是素数,当输入为2时处于无限循环。 我检查了一下,输入没有问题。 我不知道问题是什么。
代码:
MOV AL,NUM
MOV BL,02H ; The Dividing starts from 2, Hence BH is compare to 02H
MOV DX,0000H ; To avoid Divide overflow error
MOV AH,00H ; To avoid Divide overflow error
循环检查素数
L1:
DIV BL
CMP AH,00H ; Remainder is compared with 00H (AH)
JNE NEXT
INC BH ; BH is incremented if the Number is divisible by current value of BL
NEXT:
CMP BH,02H ; If BH > 02H, There is no need to proceed, It is not a Prime
JE FALSE ; The no is not a Prime No
INC BL ; Increment BL
MOV AX,0000H ; To avoid Divide overflow error
MOV DX,0000H ; To avoid Divide overflow error
MOV AL,NUM ; Move the Default no to AL
CMP BL,NUM ; Run the loop until BL matches Number. I.e, Run loop x no of times, where x is the Number given
JNE L1 ; Jump to check again with incremented value of BL
打印结果:
;To display The given no is a Prime No
TRUE:
LEA DX,MSG
MOV AH,09H ; Used to print a string
INT 21H
JMP EXIT
;To display The given no is not a Prime No
FALSE:
LEA DX,NMSG
MOV AH,09H ; Used to print a string
INT 21H
我认为这只发生在一个数字上。
答案 0 :(得分:1)
CMP BH,02H JE FALSE ; CMP BL,NUM JNE L1
如果您不允许自己将数字相除,则您的 false 条件应变为CMP BH, 1
。
如果您确实允许除以数字本身(但是为什么要这么做),则检查BH=2
是否正确。
从2除以N-1所得的余数为零时,数字不是素数。
例如对于数字9,用2、3、4、5、6、7、8除
零余数已经出现在3处,因此不是“素数”
MOV BL, 2
L1:
XOR AX, AX
MOV AL, NUM
DIV BL
TEST AH, AH
JZ FALSE
INC BL
CMP BL, NUM
JB L1
输入为2时处于无限循环中。
您必须指出这种情况。您不能将数字2从2迭代到N-1。
您可以安全处理的最小数字是3(2到2)。
您的代码因此崩溃的原因是因为您使用了JNE L1
。看看我的摘要中如何使用JB L1
吗?