溢出时,move %rbx, %rsi 做什么?

When overflow, what does move %rbx, %rsi do?

这是我的函数的汇编代码。 这是 运行 和 gcc -O2 -fsanitize=undefined

   0:   55                      push   %rbp
   1:   53                      push   %rbx
   2:   48 ba ff ff ff ff ff    movabs [=10=]x7fffffffffffffff,%rdx
   9:   ff ff 7f
   c:   48 83 ec 08             sub    [=10=]x8,%rsp
  10:   48 8b 1d 00 00 00 00    mov    0x0(%rip),%rbx        # 17 <testovf+0x17>
  17:   48 89 dd                mov    %rbx,%rbp
  1a:   48 01 d5                add    %rdx,%rbp
  1d:   70 0d                   jo     2c <testovf+0x2c>
  1f:   48 39 eb                cmp    %rbp,%rbx
  22:   0f 9f c0                setg   %al
  25:   48 83 c4 08             add    [=10=]x8,%rsp
  29:   5b                      pop    %rbx
  2a:   5d                      pop    %rbp
  2b:   c3                      retq
  2c:   48 89 de                mov    %rbx,%rsi
  2f:   bf 00 00 00 00          mov    [=10=]x0,%edi
  34:   e8 00 00 00 00          callq  39 <testovf+0x39>
  39:   eb e4                   jmp    1f <testovf+0x1f>

我理解1a加法溢出时跳转到2c。 但是,在 2c 之后, mov %rbx,%rsi 和 mov $0x0,%edi 做了什么? 他们需要在那里吗?

在地址 34 你有一个 callq 到外部函数。您询问的关于为该函数设置参数的两条指令,根据标准 64 位调用约定在寄存器 rdirsi.

中传递

请注意,调用的目标显示为 39 <testovf+0x39>,但这是不正确的。很有可能,您从 objdump 获得了此列表,却忘记使用 -r 选项来显示重定位条目。