这是来自musl的源代码:
1 __syscall_cp_asm:
2 __cp_begin:
3 mov (%rdi),%eax
4 test %eax,%eax
5 jnz __cp_cancel
6 mov %rdi,%r11
7 mov %rsi,%rax
8 mov %rdx,%rdi
9 mov %rcx,%rsi
10 mov %r8,%rdx
11 mov %r9,%r10
12 mov 8(%rsp),%r8
13 mov 16(%rsp),%r9
14 mov %r11,8(%rsp)
15 syscall
16 __cp_end:
17 ret
18 __cp_cancel:
19 jmp __cancel
我很好奇第 6 行和第 14 行的目的是什么(从链接源重新编号)。
据我了解,代码的开头测试了作为第一个参数传递的指针的目标(第 3-5 行),第 6 行然后将指针移动到r11和第 14 行然后将其移动到堆栈上使用的位置通过第 7 个参数。
这似乎没有用。这些动作有什么作用吗?