在x86中调用多个函数

时间:2013-04-12 04:44:28

标签: function x86 ia-32

我正在尝试学习x86的AT& T语法,并且我正处于一个我总体上有点困惑的地方。我知道堆栈上有帧,当调用时,在该函数中发生的第一件事是某种帧更新,然后获取参数。那么,如果我在我的主要代码区域和调用函数中的寄存器eax中有类似5的值,我仍然可以访问eax中的值5吗?或者为了将其作为参数,我必须做这样的事情。我在其他地方看到你在调用函数之前将参数推送到堆栈中,这是真的吗?我想有些事情必须定位在8(ebp)让我把它移到eax中,但是在用movl移动东西之前eax的价值是什么?是5吗?我知道这是很多问题,我只是在调用一个函数并返回一些东西时感到困惑。任何帮助将不胜感激。我敢肯定这对于一些装配大师来说就像小蛋糕一样!

Function:
pushl %ebp
movl %esp, %ebp

movl 8(ebp), eax

1 个答案:

答案 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] 指向第一个参数,因为

  • 参数从右向左传递到堆栈( [SS:EBP + 12] 指向第二个arg)
  • DWORDS是4个字节
  • [SS:EBP + 0] 指向创建堆栈框架时保存的上一个 EBP
  • [SS:EBP + 4] 指向返回地址,在 ret
  • EIP