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

问题描述 投票:0回答:1

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

我所尝试的是

.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

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

arrays assembly x86-16 subroutine
1个回答
1
投票

该程序应该使用子程序,堆栈和间接寻址模式。

然后你的程序必须做的是在 数目 数组,并调用2个子程序,一个找出这个数字是否是质数,一个找出这个数字是否是偶数。目前你几乎得到了一个很好的循环,要不是你忘记初始化了 CX 登记 LOOP 指令依赖!

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

    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

这里有一些技巧来完成任务。

  • {fnTahomafs10bord0shad01cH00FFFF}Like @Michael 在他的评论中写道,你应该有 甚至首要的 数组定义为字节。
  • 如果发现任何数字是偶数,那么它也不能是质数。这意味着你可以调用 TestForPrime 从内部 TestForEven 而不是从主循环中调用)。

    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
    
  • 如果你在这个论坛(或谷歌)上搜索,你一定会找到测试质数的好方法。好猎奇...

© www.soinside.com 2019 - 2024. All rights reserved.