使用子程序分离偶数和素数的汇编语言程序

Assembly language program to separate even and prime numbers using subroutines

我希望生成一个汇编语言程序来从给定的数字列表中分离偶数和素数。 该程序应使用子程序、堆栈和间接寻址方式。

我试过的是

.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

由于我是汇编语言的初学者,我希望知道上述要求的正确代码。任何帮助将不胜感激。

The program should make use of subroutines

然后您的程序必须做的是 运行 在 num 数组上调用 2 个子例程,一个判断数字是否为质数,另一个判断如果数字是偶数则输出。
目前你几乎得到了一个很好的循环,你不是忘记初始化 LOOP 指令所依赖的 CX 寄存器!

这已经是一个很好的循环了:

    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

这里有一些完成任务的提示:

  • 就像 在他的评论中写的那样,您应该将 evenprime 数组定义为字节。
  • 如果发现任何数是偶数,它就不可能也是质数。这意味着您可以从 TestForEven(而不是从主循环)中调用 TestForPrime

    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),您一定会找到测试素数的好方法。打猎不错...