【问题标题】:'call' instruction being called with 2 parameters使用 2 个参数调用“调用”指令
【发布时间】:2014-05-20 18:50:07
【问题描述】:

我已经反汇编了一个简单的 D 脚本(未链接),我可以找到这个奇怪的程序集(英特尔语法)

call   1e <_Dmain+0x1e>

据我了解,call 将当前堆栈基指针压入堆栈并跳转到它作为参数接收的地址。

虽然这条call 指令似乎需要两个参数。那是怎么回事?

全功能:

0000000000000000 <_Dmain>:
   0:   55                      push   rbp
   1:   48 8b ec                mov    rbp,rsp
   4:   48 83 ec 10             sub    rsp,0x10
   8:   c7 45 f8 05 00 00 00    mov    DWORD PTR [rbp-0x8],0x5
   f:   c7 45 f8 06 00 00 00    mov    DWORD PTR [rbp-0x8],0x6
  16:   48 89 ef                mov    rdi,rbp
  19:   e8 00 00 00 00          call   1e <_Dmain+0x1e>
  1e:   31 c0                   xor    eax,eax
  20:   c9                      leave  
  21:   c3                      ret    
  22:   66 0f 1f 44 00 00       nop    WORD PTR [rax+rax*1+0x0]

【问题讨论】:

  • &lt;_Dmain+0x1e&gt; 可能只是反汇编程序的一个注释,表示地址1e 对应于_Dmain 内的偏移量0x1e。
  • 这不是两个论点。 &lt;_Dmain+0x1e&gt; 只是根据调试的可执行文件解释的调用地址。
  • @DanielKamilKozar 那不就是调用下一个操作(1e)吗?
  • @JeroenBollen:是的,会的。这很奇特。 :)

标签: assembly x86 x86-64


【解决方案1】:

调用指令只接受一个操作数,它是一个非描述性的地址。反汇编程序试图变得很好并为调用目标找到一个符号。地址是 1e,那里没有符号,所以反汇编器找到最接近的符号 (_Dmain) 并给你一个偏移量。这不是第二个论点,而是对您的提示。

【讨论】:

  • 下一个手术不是 1e 吗?
  • 是的。如果仔细观察,CALL 命令编码中的内联偏移量全为零。偏移量是相对于 CALL 之后的命令。这种奇怪的电话有什么意义,我不知道。可能是管道冲洗什么的。
  • 因为 OP 提到脚本没有链接,所以零偏移量是为重定位保留空间。当脚本实际链接时,调用应该引用的任何符号都将用于计算call 指令的实际偏移量。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-11-11
  • 2016-06-30
  • 2018-10-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多