溢出时,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 位调用约定在寄存器 rdi
和 rsi
.
中传递
请注意,调用的目标显示为 39 <testovf+0x39>
,但这是不正确的。很有可能,您从 objdump 获得了此列表,却忘记使用 -r
选项来显示重定位条目。
这是我的函数的汇编代码。 这是 运行 和 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 位调用约定在寄存器 rdi
和 rsi
.
请注意,调用的目标显示为 39 <testovf+0x39>
,但这是不正确的。很有可能,您从 objdump 获得了此列表,却忘记使用 -r
选项来显示重定位条目。