Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.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
X86 windows MASM程序中堆栈的使用_X86_Masm32 - Fatal编程技术网

X86 windows MASM程序中堆栈的使用

X86 windows MASM程序中堆栈的使用,x86,masm32,X86,Masm32,我在WinAsm Studio中编写简单的MASM应用程序,遇到堆栈问题。 我已经能够在这个非常简单的程序中重新创建它: .386 .model flat, stdcall OPTION CASEMAP:NONE Include windows.inc Include kernel32.inc Include masm32.inc include user32.inc IncludeLib kernel32.lib IncludeLib masm32.lib IncludeLib user3

我在WinAsm Studio中编写简单的MASM应用程序,遇到堆栈问题。
我已经能够在这个非常简单的程序中重新创建它:

.386
.model flat, stdcall
OPTION CASEMAP:NONE 

Include windows.inc
Include kernel32.inc
Include masm32.inc
include user32.inc
IncludeLib kernel32.lib
IncludeLib masm32.lib
IncludeLib user32.lib 

.code
aProc proc near
  push 1
  ret
aProc endp

bProc proc near
  pop edx
  ret
bProc endp

start:
  call aProc
  call bProc
  invoke ExitProcess, 0
end start
在本例中,我试图在一个过程(
aProc
)中将一些值放入堆栈,然后在另一个过程(
bProc
)中检索它们


你能解释一下为什么这个代码会导致程序崩溃(
访问冲突
)以及如何正确使用堆栈吗?

push 1后跟ret将尝试返回位置1。start还需要ret指令或某种类型的OS exit调用。在本例中,我跳过了start的ret以使其更简单。已经修复。关于第一件事:这是否意味着我不能在过程中使用堆栈?可以,但返回地址也在堆栈上,所以必须考虑这一事实。你可以先把它放在寄存器中,推送你的值,然后把它推回到栈顶,然后你可以重新调用。你的问题是:你不理解一个函数的概念。堆栈是后进先出数据类型。