【问题标题】:MASM code for finding prime numbers not working用于查找素数的 MASM 代码不起作用
【发布时间】:2013-08-04 19:34:46
【问题描述】:

我有以下代码用于查找素数:

   isPrime PROC; checks if a number is prime by dividing out values less than it until it finds one that has a remainder of 0
         ;or the test value reaches the number

retest:
inc testNum
mov eax, testPrime
cmp eax, testNum
je  prime
mov edx, 0
mov eax, testPrime
mov ebx, testNum
div ebx
cmp edx, ZERO
jg retest
mov eax, 1
mov testNum, eax
inc testPrime
prime:
ret
isPrime ENDP

它应该工作的方式是 testPrime 是被测试的数字。然后它检查 testNum,它从 2 开始(开始时为 1,但立即递增)并将 testPrime 除以 testNum。如果余数为零,则除以,并且 testPrime 不是质数。 testPrime 增加,testNum 被重置,整个事情重新开始。如果 testPrime 和 testNum 相等,那么它是一个素数,并且过程退出(这导致程序的另一部分打印它,并在增加 testPrime 后再次调用该过程)。

正在发生的事情是它正在打印从 2 到请求多个素数的每个整数。我做了一些调试,似乎 edx 不知何故得到了一个奇怪的大数字,但我不知道如何。

【问题讨论】:

    标签: assembly masm


    【解决方案1】:

    设法修复它。由于调试断点的放置不当,我没有意识到 edx 寄存器正在被正确使用。但是,我的代码中还存在另外两个问题。

    工作代码如下。注意在 prime: 标记之前的新 jmp 命令,以及在 return 之前对 testNum 的新重置。

    isPrime PROC; checks if a number is prime by dividing out values less than it until it finds one that has a remainder of 0
             ;or the test value reaches the number
     retest:
    inc testNum
    mov eax, testPrime
    cmp eax, testNum
    je  prime
    mov edx, 0
    mov eax, testPrime
    mov ebx, testNum
    div ebx
    mov eax, edx
    cmp eax, ZERO
    jg retest
    mov eax, 1
    mov testNum, eax
    inc testPrime
    jmp retest
     prime:
    mov eax, 1
    mov testNum, eax
    ret
    isPrime ENDP
    

    【讨论】:

      【解决方案2】:
      data segment
      
       ddd db 00h,00h,00h
      
      ends
      
      stack segment
          dw   128  dup(0)
      ends
      
      code segment
      
      proc zzz
      push ax
      push dx 
      push bx    
      lea di,ddd
      mov bx,10  
      div bl
      mov ds:[di+2],ah
      add ds:[di+2],48
      mov ah,0
      div bl
      mov ds:[di+1],ah
      add ds:[di+1],48
      mov ah,0
      div bl
      mov ds:[di],ah
      add ds:[di],48 
      mov ah, 2
      mov dx,ds:[di]
      int 21h
      mov dx,ds:[di+1]
      int 21h
      mov dx,ds:[di+2]
      int 21h 
      pop bx
      pop dx
      pop ax
      ret
      endp
      start:
      
      mov ax,@data
      mov ds,ax
      mov es,ax
      
      mov si,03d
      mov di,50d 
      wwww:mov ax,si
      mov bp,si
      sub bp,2       
      mov bx,01h
      mov cx,2     
      fff:mov dx,00h
      push ax
      div cx 
      pop ax
      cmp dx,00 
      je sss
      jmp con1
      sss:mov bx,00h 
      con1:inc cx
      dec bp
      jnz fff    
      cmp bx,01h
      je xxxx
      jne mmmm
      xxxx:call zzz
      mmmm:inc si
      cmp si,50d
      je bbb
      jmp wwww
      bbb:ends 
      
      ends
      
      end start
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-01-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多