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