【问题标题】:Assembly language program to separate even and prime numbers using subroutines使用子例程分隔偶数和素数的汇编语言程序
【发布时间】:2020-04-18 11:29:00
【问题描述】:

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

我试过的是

.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

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

【问题讨论】:

  • 目前尚不清楚您遇到了什么问题,因此您需要缩小您的问题范围。还有,当num是字节数组时,为什么evenprime是字数组?

标签: arrays assembly x86-16 subroutine


【解决方案1】:

程序应该使用子程序

然后您的程序必须做的是在 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

以下是完成任务的一些提示:

  • 就像@Michael 在他的评论中所写,您应该将 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),您肯定会找到测试素数的好方法。很好的狩猎...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-01-19
    • 2016-09-27
    • 1970-01-01
    • 2012-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多