Программа должна использовать подпрограммы
То, что ваша программа должна сделать, это запустить над массивом num и вызвать 2 подпрограммы, одна из которых обнаруживает если число простое и то, которое определяет, является ли число четным.
В настоящее время вы почти получили хороший l oop, если бы вы не забыли инициализировать регистр CX
, от которого зависит инструкция LOOP
вкл!
Это уже хороший l oop:
lea bx, num
lea si, even
lea di, prime
mov cx, 12 ; There are 12 numbers in the 'num' array
L1:
mov al, [bx]
call TestForEven
call TestForPrime
inc bx
loop L1
Ваш тест, чтобы выяснить, является ли число даже делением на 2. Это расточительное решение! Все, что вам нужно сделать, это проверить, является ли младший бит числа 0.
TestForEven:
test al, 1 ; This tests the lowest bit
jnz NotEven
mov [si], al ; Adding to the 'even' array
inc si
NotEven:
ret
Вот несколько советов для выполнения задачи:
- Как @ Michael написал в своем комментарии, вы должны иметь массивы even и prime , определенные как байты.
Если какое-либо число окажется четным, это также не может быть простым. Это означает, что вы можете сделать вызов TestForPrime из TestForEven (вместо основного l oop).
TestForEven:
test al, 1 ; This tests the lowest bit
jnz NotEven
mov [si], al ; Adding to the 'even' array
inc si
ret
NotEven:
call TestForPrime
ret
И поскольку этот встроенный вызов теперь стал тем, что называется хвостовым вызовом, инструкция call
больше не нужна:
TestForEven:
test al, 1 ; This tests the lowest bit
jnz TestForPrime
mov [si], al ; Adding to the 'even' array
inc si
ret
TestForPrime:
...
ret
Если вы будете искать в этом форуме (или в Google), вы наверняка найдете хорошие способы проверить простое число. Удачной охоты ...