我正在尝试学习x86的AT& T语法,并且我正处于一个我总体上有点困惑的地方。我知道堆栈上有帧,当调用时,在该函数中发生的第一件事是某种帧更新,然后获取参数。那么,如果我在我的主要代码区域和调用函数中的寄存器eax中有类似5的值,我仍然可以访问eax中的值5吗?或者为了将其作为参数,我必须做这样的事情。我在其他地方看到你在调用函数之前将参数推送到堆栈中,这是真的吗?我想有些事情必须定位在8(ebp)让我把它移到eax中,但是在用movl移动东西之前eax的价值是什么?是5吗?我知道这是很多问题,我只是在调用一个函数并返回一些东西时感到困惑。任何帮助将不胜感激。我敢肯定这对于一些装配大师来说就像小蛋糕一样!
Function:
pushl %ebp
movl %esp, %ebp
movl 8(ebp), eax
答案 0 :(得分:1)
This页面基本上应该包装起来。
使用 cdecl ,你就像
一样; I'm not comfortable with AT&T syntax, but it's not relevant here
; void *processData(void *firstParam, void *secondParam)
proc processData
push ebp
mov ebp,esp
mov eax,[dword ptr ss:ebp + 8] ; firstParam
mov edx,[dword ptr ss:ebp + 12] ; secondParam
; do something with the data and put the result into EAX
mov esp,ebp
pop ebp
ret
endp processData
你像
一样调用它lea eax,[ds:bufferOfSecondParam]
push eax
lea eax,[ds:bufferOfFirstParam]
push eax
call processData
add esp,8
; Here you can do with the return value anything you want
首先,您需要决定要使用的调用约定。例如,Win32使用名为 stdcall 的 cdecl 变体,其中被调用者负责清理堆栈 - 这不太方便实现,也不允许varargs
[SS:EBP + 8] 指向第一个参数,因为