我在汇编中有以下代码:
.686
.model flat, stdcall
.stack 4096
ExitProcess proto, dwExitCode : dword
.data
Temporal DWORD ?
mdc_result DWORD ?
.code
main PROC
push ebp
mov ebp, esp
push 120
push 25
call MCD_iterativo
pop ebp
ret 0
main ENDP
MCD_iterativo PROC ; a = 4, b = 8
push ebp
mov ebp, esp
jmp L2
pop ebp
ret
MCD_iterativo ENDP
L2:
cmp DWORD PTR [ebp + 8], 0
je L1
mov eax, DWORD PTR [ebp + 8]
mov DWORD PTR Temporal, eax
mov eax, DWORD PTR [ebp + 12]
cdq
idiv DWORD PTR [ebp + 8]
mov DWORD PTR [ebp + 8], edx
mov ecx, DWORD PTR Temporal
mov DWORD PTR [ebp + 12], ecx
jmp L2
L1:
mov eax, DWORD PTR [ebp + 12]
pop ebp
ret 0
END main
我得到以下错误:Exception occurred at 0x00000005 in ASM_Miercoles_Semana10.exe: 0xC0000005: Access violation when executing location 0x00000005.
我试着做了一个add
进入esp和ebp变量以恢复初始地址,但它不知道,我只想在没有错误的情况下完成程序我正在尝试实现两个函数,第二个函数里面有一个while
,循环工作得很好,最后我在主PROC 的ret中有错误
最好的解决方案是在Visual Studio中调试代码。基本上,循环[L1,L2]之间的代码在某个时刻会脱离程序堆栈的约束,进入操作系统的受限区域。当这种情况发生时,操作系统会崩溃程序,因为您不被允许访问这些信息。