Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typo3/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
Function 在x86中调用多个函数_Function_X86 - Fatal编程技术网

Function 在x86中调用多个函数

Function 在x86中调用多个函数,function,x86,Function,X86,我正试图学习x86 AT&T语法,但总的来说我有点困惑。我知道堆栈上有帧,当调用时,该函数中发生的第一件事是某种帧更新,然后获取参数。所以,如果我在代码和调用函数的主要区域中的寄存器eax中有一些类似于5的值,我仍然可以访问eax中的值5,对吗?或者,为了得到它作为一个参数,我必须这样做。我在其他地方看到,在调用函数之前,您将参数推送到堆栈中,这是真的吗?我想有些东西必须位于8(ebp)才能将其移动到eax中,但在我使用movl将某些东西移动到eax中之前,eax的值是多少?是五点吗?我知道这是

我正试图学习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的返回地址

必须有人知道在x86中使用参数调用函数的正确方法!