Function 在x86中调用多个函数
我正试图学习x86 AT&T语法,但总的来说我有点困惑。我知道堆栈上有帧,当调用时,该函数中发生的第一件事是某种帧更新,然后获取参数。所以,如果我在代码和调用函数的主要区域中的寄存器eax中有一些类似于5的值,我仍然可以访问eax中的值5,对吗?或者,为了得到它作为一个参数,我必须这样做。我在其他地方看到,在调用函数之前,您将参数推送到堆栈中,这是真的吗?我想有些东西必须位于8(ebp)才能将其移动到eax中,但在我使用movl将某些东西移动到eax中之前,eax的值是多少?是五点吗?我知道这是很多问题,我只是在调用函数并返回一些东西的时候感到困惑。任何帮助都将不胜感激。我相信这对一些大会大师来说就像小菜一碟Function 在x86中调用多个函数,function,x86,Function,X86,我正试图学习x86 AT&T语法,但总的来说我有点困惑。我知道堆栈上有帧,当调用时,该函数中发生的第一件事是某种帧更新,然后获取参数。所以,如果我在代码和调用函数的主要区域中的寄存器eax中有一些类似于5的值,我仍然可以访问eax中的值5,对吗?或者,为了得到它作为一个参数,我必须这样做。我在其他地方看到,在调用函数之前,您将参数推送到堆栈中,这是真的吗?我想有些东西必须位于8(ebp)才能将其移动到eax中,但在我使用movl将某些东西移动到eax中之前,eax的值是多少?是五点吗?我知道这是
Function:
pushl %ebp
movl %esp, %ebp
movl 8(ebp), eax
佩奇应该基本上把它总结起来
有了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]指向第一个参数,因为
- 参数从右向左传递到堆栈上([SS:EBP+12]指向第二个参数)
- DWORD是4个字节
- [SS:EBP+0]指向创建堆栈帧时保存的上一个EBP
- [SS:EBP+4]指向ret时重新加载到EIP的返回地址