PrimeCheck 8086 Сборочный баг - PullRequest
1 голос
/ 21 июня 2019

Я написал программу сборки 8086, которая выполняет следующие действия:

  1. Получает входные данные от пользователя
  2. Преобразует его в целое число
  3. Проверьте, является ли оно простым

Проблема с шагом 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

Цикл для проверки на Prime No

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 Ответ

1 голос
/ 22 июня 2019
CMP BH,02H
JE FALSE
;
CMP BL,NUM
JNE L1   

Это ваша проблема.

Если вы не разрешаете делить число по себе, тогда ваш ложный критерий должен стать 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 до N-1 для числа 2.
Наименьшее число, которое вы можете безопасно обработать, - это 3 (от 2 до 2).

Причина, по которой ваш код вызывает сбой, заключается в том, чтоВы использовали JNE L1.Посмотрите в моем фрагменте, как я использовал JB L1?

...