Программа на ассемблере для разделения четных и простых чисел с помощью подпрограмм - PullRequest
0 голосов
/ 18 апреля 2020

I wi sh для создания программы на языке ассемблера для отделения четных и простых чисел от заданного списка чисел. Программа должна использовать подпрограммы, стек и режим косвенной адресации.

Я попробовал

.model small
  .data
     num db 0,13,4,7,8,9,14,15,2,10,19,20
     even dw 20 dup ?
     prime dw 20 dup ?

 .code
   mov ax, @ data
   mov ds, ax
   LEA BX,num
   LEA SI, even
   LEA DI, prime
   mov dh,02
L1:
   mov ah,00
   mov al, [BX]
   mov dl, al
   div dh
    cmp ah,00
    JE EVEN
EVEN:
     mov [SI], dl
     INC SI
     INC BX
     LOOP L1

Поскольку я новичок в языке ассемблера, я sh знаю правильный код для вышеуказанного требования. Любая помощь будет оценена.

1 Ответ

1 голос
/ 19 апреля 2020

Программа должна использовать подпрограммы

То, что ваша программа должна сделать, это запустить над массивом 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), вы наверняка найдете хорошие способы проверить простое число. Удачной охоты ...

...