确定传递给函数的参数

时间:2015-10-24 15:58:38

标签: c debugging assembly gdb

以下是反汇编代码:

=> 0x08048d62 <+0>:     sub    $0x2c,%esp 
  0x08048d65 <+3>:     lea    0x1c(%esp),%eax 
  0x08048d69 <+7>:     mov    %eax,0xc(%esp) 
  0x08048d6d <+11>:    lea    0x18(%esp),%eax 
  0x08048d71 <+15>:    mov    %eax,0x8(%esp) 
  0x08048d75 <+19>:    movl   $0x804a681,0x4(%esp) 
  0x08048d7d <+27>:    mov    0x30(%esp),%eax 
  0x08048d81 <+31>:    mov    %eax,(%esp) 
  0x08048d84 <+34>:    call   0x80488d0 <__isoc99_sscanf@plt> 
  0x08048d89 <+39>:    cmp    $0x2,%eax 
  0x08048d8c <+42>:    jne    0x8048d95 <phase_4+51> 
  0x08048d8e <+44>:    cmpl   $0xe,0x18(%esp) 
  0x08048d93 <+49>:    jbe    0x8048d9a <phase_4+56> 
  0x08048d95 <+51>:    call   0x8049385 <explode_bomb> 
  0x08048d9a <+56>:    movl   $0xe,0x8(%esp) 
  0x08048da2 <+64>:    movl   $0x0,0x4(%esp) 
  0x08048daa <+72>:    mov    0x18(%esp),%eax 
  0x08048dae <+76>:    mov    %eax,(%esp) 
  0x08048db1 <+79>:    call   0x8048d05 <func4> 
  0x08048db6 <+84>:    cmp    $0x25,%eax 
  0x08048db9 <+87>:    jne    0x8048dc2 <phase_4+96> 
  0x08048dbb <+89>:    cmpl   $0x25,0x1c(%esp) 
  0x08048dc0 <+94>:    je     0x8048dc7 <phase_4+101> 
  0x08048dc2 <+96>:    call   0x8049385 <explode_bomb> 
  0x08048dc7 <+101>:   add    $0x2c,%esp 
  0x08048dca <+104>:   ret  

我知道大多数汇编指令的作用,但我通过一些互联网搜索知道func4中的参数是(x,0,14)

似乎参数存储在$ esp。

我们如何知道基于汇编代码加载参数的位置?总是在$ esp吗?

1 个答案:

答案 0 :(得分:0)

https://en.wikibooks.org/wiki/X86_Disassembly/Calling_Conventions 从地址来看,它看起来像一个32位系统。对于linux / x86,参数位于堆栈上,esp是堆栈指针,可帮助您检索它们。