【问题标题】:When overflow, what does move %rbx, %rsi do?溢出时,move %rbx, %rsi 做什么?
【发布时间】:2015-10-27 00:50:57
【问题描述】:

这是我的函数的汇编代码。 这是使用 gcc -O2 -fsanitize=undefined

运行的
   0:   55                      push   %rbp
   1:   53                      push   %rbx
   2:   48 ba ff ff ff ff ff    movabs $0x7fffffffffffffff,%rdx
   9:   ff ff 7f
   c:   48 83 ec 08             sub    $0x8,%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    $0x8,%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    $0x0,%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 做了什么? 他们需要在那里吗?

【问题讨论】:

  • 托尼,停止编辑问题的正文。没有代码,这是一个不完整且无用的问题,应该删除。如果您要进行编辑,请同时输入新内容。如果您有其他问题,请发布新问题

标签: assembly optimization x86-64


【解决方案1】:

在地址34,您有一个外部函数的callq。您询问的关于设置该函数的参数的两条指令,根据标准 64 位调用约定,在寄存器 rdi 和 rsi 中传递。

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

【讨论】:

  • 当我使用 -r 选项时,只有添加到代码中的内容是: 30: R_X86_64_32 .data+0x20 34: e8 00 00 00 00 callq 39 35: R_X86_64_PC32 __ubsan_handle_add_overflow-0x4 39 : eb e4 jmp 1f 你知道这是什么意思吗?
  • 是的,它告诉你调用的函数真的是__ubsan_handle_add_overflow。
猜你喜欢
  • 2012-06-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-13
  • 2014-01-15
  • 1970-01-01
  • 1970-01-01
  • 2011-02-28
相关资源
最近更新 更多