PrimeCheck 8086组装错误

时间:2019-06-21 17:03:16

标签: assembly x86-16 emu8086

我编写了一个8086汇编程序,该程序执行以下操作:

  1. 获取用户输入
  2. 将其转换为整数
  3. 检查是否为质子

问题出在第三步,它有一个错误。 它说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

我认为这只发生在一个数字上。

1 个答案:

答案 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吗?