Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly x86程序错误_Assembly_X86_Masm - Fatal编程技术网

Assembly x86程序错误

Assembly x86程序错误,assembly,x86,masm,Assembly,X86,Masm,我编写了一个程序,从1递增,检查100以下的每个数字,如果是素数,则该数字将存储到一个数组中。然而,我遇到的问题是,数组中没有存储任何内容,寄存器没有按预期使用。就其本身而言,“_isPrime”过程完全按照预期工作,但当我将其与主代码组合在一起时,然后调用它,这就是错误似乎来自的地方。我的循环是否在主循环中正确实现?在这个过程中我还应该做什么 .DATA arr DWORD 27 DUP (?) .CODE _MainProc PROC mov

我编写了一个程序,从1递增,检查100以下的每个数字,如果是素数,则该数字将存储到一个数组中。然而,我遇到的问题是,数组中没有存储任何内容,寄存器没有按预期使用。就其本身而言,“_isPrime”过程完全按照预期工作,但当我将其与主代码组合在一起时,然后调用它,这就是错误似乎来自的地方。我的循环是否在主循环中正确实现?在这个过程中我还应该做什么

.DATA

arr DWORD 27 DUP (?)

.CODE           
_MainProc   PROC

        mov eax, 1      ; number in eax will be prime checked / edx will be 1 if true
J1:     
        mov edx, 0      ; clear edx 
        inc eax         ; increment eax to begin prime checking
        cmp eax, 100    ; if eax reaches 100 loop ends
        je J2
        push eax
        push edx
        call _isPrime   ; prime check on eax
        cmp  edx, 0     ; if not prime begin loop again
        je J1
        mov [arr], eax  ; if prime eax is stored into array
        jmp J1          ; loop begins again
 
J2:
      
    mov     eax, 0
    ret

_MainProc   ENDP

_isPrime PROC 

        push ebp 
        mov  ebp, esp 
        push ecx
        push ebx

        cmp     eax,1
        jle     L2
        mov     ecx,eax
        shr     ecx,1
        mov     ebx,2
        mov     edx,1
L1:
        cmp     ebx,ecx
        jg      L2
        push    eax
        mov     edx,0
        div     ebx
        cmp     edx,0
        je      L2
        inc     ebx
        jmp     L1
        mov     edx,1
L2:
                      
        pop ebx
        pop ecx
        pop ebp
        ret

_isPrime ENDP            

END   

您根本不需要提供这个
EDX
参数。_isPrime过程不将其用作参数。
接下来,您需要平衡堆栈。您可以选择使用
ret 4
从proc返回,以弹出唯一的参数
EAX
,前提是至少proc使用类似
mov EAX、[ebp+8]
的指令获取它

你将把每个素数都存储在其他素数之上

    mov edi, offset arr

    ...

    mov [edi], eax
    add edi, 4
    jmp J1
这可能行得通


在_isPrime中,您无法在
EAX
中保留值,因为缺少
pop EAX

push    eax       ; (1)
xor     edx, edx
div     ebx
pop     eax       ; (1)
test    edx, edx
jz      L2
为了正确操作,
mov edx,1
指令需要在循环中执行,而不是在循环之前执行

L1:     mov     edx,1
        cmp     ebx,ecx
        jg      L2

我说过多少次了:使用调试器
main
isPrime
推送参数,但没有人弹出它们。
isPrime
还有一个
push eax
,它与
pop
不匹配。我不确定你所说的“内存丢失”是什么意思。我认为您可能对堆栈的工作方式有误解。顺便说一下,您已经标记了它,但是语法看起来像。这是错误吗?别忘了设置
DS
段寄存器。类似于mov-ax,@data
mov-ds,ax
  push    eax
  mov     edx,0
  div     ebx
  cmp     edx,0
  je      L2
push    eax       ; (1)
xor     edx, edx
div     ebx
pop     eax       ; (1)
test    edx, edx
jz      L2
L1:     mov     edx,1
        cmp     ebx,ecx
        jg      L2