assembly 程序一直对我输入的任何数字说“不是素数”

wfveoks0  于 2022-11-13  发布在  其他
关注(0)|答案(1)|浏览(149)

所以这是我第一次在这里写帖子,我对汇编语言很陌生,从emu 8086开始了学习之旅。
最近我写了一个程序,它可以检测输入的数字是正数还是负数,并判断它是否是素数。我把它作为第一部分(使用数组检测正数或负数),但由于某种原因,它总是对我输入的任何数字说“不是素数”。
我试图让它复制存储在数组中的数字,并将其带到程序的素数/非素数部分,但没有用。
有人知道问题出在哪里吗?我现在很迷茫。
下面是我编写的代码:

.MODEL  SMALL 
.STACK 100H
.DATA  
ARRAY DB DUP('$')

          NUM       DB      ?
          MSG1      DB      0AH,0DH,'ENTER YOUR DESIRED NUMBER:','$'
          MSG2      DB      0AH,0DH,'NOT A PRIME NUMBER','$'
          MSG3      DB      0AH,0DH,'A PRIME NUMBER','$'  
          POSI      DB      0AH,0DH,'A POSITIVE NUMBER','$'
          NEGA      DB      0AH,0DH,'A NEGATIVE NUMBER','$'

.CODE
MAIN    PROC

            MOV AX,@DATA
            MOV DS,AX
            MOV SI, OFFSET ARRAY

            LEA DX,MSG1
            MOV AH,9
            
            INT 21H
    
            MOV AH,1
            INT 21H
            
            CMP AL,13
            JE CHECK
            MOV [SI],AL  
            INC SI
            JMP L1

    L1:
    MOV AH,1
    INT 21H
    CMP AL,13
    JE CHECK
    MOV [SI],AL  
    INC SI
    JMP L1 
    
    CHECK:
    CMP ARRAY, '-' ;IF ARRAY CONTAINS - SIGN THEN THE NUMBER IS NEGATIVE
    JE L2
    
    MOV DX, OFFSET POSI
    MOV AH,9
    INT 21H  
    
    JMP EXIT1

    L2:
    MOV DX, OFFSET NEGA
    MOV AH,9
    INT 21H

    EXIT1:
    mov al, [NUM]
mov bl, al
sub al, 2
mov cl, al ; counter value

; original input

mov dl, 2
l3:
mov ax, bx
div dl
cmp ah, 0h
jz pnot
inc dl

loop  l3

mov ah, 9h
  lea dx, msg3
  int 21h
  jmp end
  
pnot:
  mov ah, 9h
  lea dx, msg2
  int 21h

END:
    MOV AH,4CH
    INT 21H
    
    MAIN ENDP
END MAIN

任何帮助将不胜感激,提前感谢您!

72qzrwbm

72qzrwbm1#

您正在将想要处理素数的新代码添加到已经损坏的程序中!
.DATA部分中,您写入了:

ARRAY DB DUP('$')
NUM       DB      ?

我不明白这是如何通过emu 8086的解析器看到DUP操作符的计数缺失的。可能 ARRAYNUM 都引用了同一个内存地址,那里只保留了1个字节的空间。
你的“正/负”程序输入一个多位数,前面有一个可选的减号,这个程序看起来工作得很好,因为你只比较了一个字节和“-”,第一条消息被覆盖了,没有显示出来。
你今天写的程序不是处理一个多位数的数字,而是处理输入的第一个数字(希望它确实是一个数字,而不是一个减号或其他字符)。
由于 ARRAY 的定义错误,mov al, [NUM]指令可以检索第一个数字**,但此数字仍为字符形式**。它是一个ASCII代码,范围在48到57之间。在将其用于计算之前,需要减去48。
计算也是危险得错误,因为您将AX除以DL时不知道AH中得内容,并且使用依赖于CX寄存器得loop指令时不知道CH中得内容.
下一个代码显示了修正。我没有尝试优化,因为在这种情况下,这几乎是不值得的...无论如何,总是有Checking Prime number in 8086 Assembly为那些对代码的优化版本感兴趣。

...

.DATA  
ARRAY     DB      16 DUP(0)
NUM       DB      0
MSG1      DB      0AH,0DH,'ENTER YOUR DESIRED NUMBER:','$'

          ...

          If you find that the first byte at ARRAY is '-'
          then better not start the prime test

          ...

EXIT1:  mov     al, [ARRAY]         ; ["0","9"]
        sub     al, 48              ; [0,9]
        mov     bl, al              ;
        mov     bh, 0               ; AL -> BX (original number)
        mov     cl, al
        mov     ch, 0
        sub     cx, 2               ; AL-2 -> CX (loop count)
        jbe     YES                 ; Consider [0,2] prime for simplicity!
        mov     dl, 2               ; Processing [3,9] with CX=[1,7] so LOOP doesn't fail
l3:     mov     ax, bx
        div     dl
        cmp     ah, 0
        je      NO
        inc     dl
        loop    l3

YES:    mov     ah, 9h
        lea     dx, msg3
        int     21h
        jmp     end
  
NO:     mov     ah, 9h
        lea     dx, msg2
        int     21h

END:    mov     ax, 4C00h
        int     21h

        ...

相关问题