当前位置: 首页 > 知识库问答 >
问题:

如何理解这一点

高峻
2023-03-14

请查看以下代码片段:

int& sum(int& num1, int& num2) {
    num1++;
    num2++;
}

00000000 <_Z3sumRiS_>:
   0:   55                      push   %ebp
   1:   89 e5                   mov    %esp,%ebp
   3:   e8 fc ff ff ff          call   4 <_Z3sumRiS_+0x4>    // why here is a jump
   8:   05 01 00 00 00          add    $0x1,%eax     

   // why 0x8, my understanding is there are in total 3 parameters
   // num2 -- 0xc(%ebp), num1 -- 0x8(%ebp), this -- 0x4(%ebp)
   // am I right????
   d:   8b 45 08                mov    0x8(%ebp),%eax

  10:   8b 00                   mov    (%eax),%eax
  12:   8d 50 01                lea    0x1(%eax),%edx        // what the heck is this?
  15:   8b 45 08                mov    0x8(%ebp),%eax
  18:   89 10                   mov    %edx,(%eax)
  1a:   8b 45 0c                mov    0xc(%ebp),%eax
  1d:   8b 00                   mov    (%eax),%eax
  1f:   8d 50 01                lea    0x1(%eax),%edx
  22:   8b 45 0c                mov    0xc(%ebp),%eax
  25:   89 10                   mov    %edx,(%eax)
  27:   90                      nop
  28:   5d                      pop    %ebp
  29:   c3                      ret    

我需要弄清楚每一行的意思,有点让我困惑。

共有1个答案

洪永长
2023-03-14
   3:   e8 fc ff ff ff          call   4 <_Z3sumRiS_+0x4>

这不是调用的真正目的地,它是链接器将填充的东西。如果您运行Objump-dr sum. o,您会发现它实际上是对__x86.get_pc_thunk.ax的调用。下面的add也是如此,以设置一个指向GO的指针。(这个函数不需要一个,但是您在编译时没有进行优化,默认情况下-fpie处于打开状态。)

有关更多详细信息,请看一下为什么gcc会生成没有flag-fno pie的奇怪代码?

System V i386 ABI第2.2.2节讲述了堆栈框架的结构。

因此,堆栈框架如下所示:

0xc  |      num2      |
0x8  |      num1      |
0x4  | return address |
0x0  | previous %ebp  |  <-- %ebp

对于剩下的说明,这里是一个逐步分析。

// as num1 and num2 are references, they represents address in assembly
   d:   8b 45 08                mov    0x8(%ebp),%eax        // load num1 to %eax
  10:   8b 00                   mov    (%eax),%eax           // load *num1 to %eax
  12:   8d 50 01                lea    0x1(%eax),%edx        // put *num1 + 1 into %edx
  15:   8b 45 08                mov    0x8(%ebp),%eax        // load num1 to %eax
  18:   89 10                   mov    %edx,(%eax)           // save *num1 + 1 at num1
  1a:   8b 45 0c                mov    0xc(%ebp),%eax        // same as above
  1d:   8b 00                   mov    (%eax),%eax
  1f:   8d 50 01                lea    0x1(%eax),%edx
  22:   8b 45 0c                mov    0xc(%ebp),%eax
  25:   89 10                   mov    %edx,(%eax)
 类似资料:
  • 我们目前面临的问题是,在应用程序的某个地方生成了一个巨大的异常。由于我们使用的是Grails和spring框架,异常就在其中的某个地方抛出。 似乎有一些无休止的循环,并且异常堆栈越来越长,每次再次抛出它。我不知道代码中是什么导致了这种情况,我认为这只是常见的错误配置或小错误之一,有时会使Grails严重失败。 我将尝试在这里概述异常的主要部分,但由于一个抛出的异常在日志中使用了2 GB,所以我只能

  • 一致性不过从协议层面上看,⼀致性的选型已经很长时间没有新的成员加入了。目前来看基本 可以归为两家:⼀种是基于 Leader 的非对等部署的单点写⼀致性,⼀种是对等部署的多写⼀致性。 如何理解这句话? 分别有哪些实现?

  • 模板中使用 这不是自动解包了么

  • 如何理解这条Mysql模糊查询语句 我不太理解这两种写法字符串的拼接结果是什么

  • 我试图将我的fetch查询的响应状态打印到控制台(以便以后处理那些边缘情况)。但是,唯一有效的console.log调用是“违规”函数中的调用。当帐户存在于HIBP数据库中时,我没有收到任何错误,但是当帐户不在数据库中时,我收到“请求失败:类型错误:响应. json不是json的函数”错误。我做错了什么?我从Google Web Dev文章中获得了错误处理代码。