user: 下面的汇编指令对应的C源代码是什么:

```asm
<util_resolve_sys_link>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x450,%rsp
  mov    %rdi,-0x438(%rbp)
  mov    %rsi,-0x440(%rbp)
  mov    %rdx,-0x448(%rbp)
  mov    %fs:0x28,%rax
  mov    %rax,-0x8(%rbp)
  xor    %eax,%eax
  lea    -0x410(%rbp),%rcx
  mov    -0x440(%rbp),%rax
  mov    $0x400,%edx
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <readlink@plt>
  mov    %eax,-0x41c(%rbp)
  cmpl   $0x0,-0x41c(%rbp)
  jg     L5
  mov    $0xffffffff,%eax
  jmp    L59
L5:
  mov    -0x41c(%rbp),%eax
  cltq
  movb   $0x0,-0x410(%rbp,%rax,1)
  lea    -0x410(%rbp),%rcx
  mov    -0x440(%rbp),%rdx
  mov    -0x438(%rbp),%rax
  lea    D27(%rip),%rsi
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <udev_log_null@plt>
  movl   $0x0,-0x420(%rbp)
  jmp    L76
L19:
  addl   $0x1,-0x420(%rbp)
L76:
  mov    -0x420(%rbp),%edx
  mov    %edx,%eax
  add    %eax,%eax
  add    %edx,%eax
  lea    -0x410(%rbp),%rdx
  cltq
  add    %rdx,%rax
  mov    $0x3,%edx
  lea    D45(%rip),%rcx
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <strncmp@plt>
  test   %rax,%rax
  je     L19
  mov    -0x420(%rbp),%edx
  mov    %edx,%eax
  add    %eax,%eax
  add    %edx,%eax
  lea    -0x410(%rbp),%rdx
  cltq
  lea    (%rdx,%rax,1),%rcx
  mov    -0x420(%rbp),%esi
  mov    -0x440(%rbp),%rdx
  mov    -0x438(%rbp),%rax
  mov    %esi,%r8d
  lea    D28(%rip),%rsi
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <udev_log_null@plt>
  movl   $0x0,-0x424(%rbp)
  jmp    L86
L21:
  mov    -0x440(%rbp),%rax
  mov    $0x2f,%esi
  mov    %rax,%rdi
  call   <strrchr@plt>
  mov    %rax,-0x418(%rbp)
  cmpq   $0x0,-0x418(%rbp)
  jne    L22
  mov    $0xffffffff,%eax
  jmp    L59
L22:
  mov    -0x418(%rbp),%rax
  movb   $0x0,(%rax)
  addl   $0x1,-0x424(%rbp)
L86:
  mov    -0x424(%rbp),%eax
  cmp    -0x420(%rbp),%eax
  jle    L21
  mov    -0x440(%rbp),%rdx
  mov    -0x438(%rbp),%rax
  lea    D30(%rip),%rcx
  mov    %rcx,%rsi
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <udev_log_null@plt>
  mov    -0x448(%rbp),%rdx
  mov    -0x440(%rbp),%rax
  lea    D11(%rip),%rcx
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <util_strlcat@plt>
  mov    -0x420(%rbp),%edx
  mov    %edx,%eax
  add    %eax,%eax
  add    %edx,%eax
  lea    -0x410(%rbp),%rdx
  cltq
  lea    (%rdx,%rax,1),%rcx
  mov    -0x448(%rbp),%rdx
  mov    -0x440(%rbp),%rax
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <util_strlcat@plt>
  mov    $0x0,%eax
L59:
  mov    -0x8(%rbp),%rdx
  sub    %fs:0x28,%rdx
  je     L3
  call   <__stack_chk_fail@plt>
L3:
  leave
  ret
```

tool_calls: name: read_data
arguments: data_tag: D27
datatype: string
name: read_data
arguments: data_tag: D45
datatype: string
name: read_data
arguments: data_tag: D28
datatype: string
name: read_data
arguments: data_tag: D30
datatype: string
name: read_data
arguments: data_tag: D11
datatype: string

tool: D27: path link '%s' points to '%s'


tool: D45: ../

tool: D28: base '%s', tail '%s', back %i


tool: D30: after moving back '%s'


tool: D11: /

assistant: ```c
int util_resolve_sys_link(struct udev *udev, char *syspath, size_t size) {
  char link_target[1024];
  int len;
  int i;
  int back;
  len = readlink(syspath, link_target, sizeof(link_target));
  if (len <= 0)
    return -1;
  link_target[len] = '\0';
  udev_log_null(udev, "path link '%s' points to '%s'\n", syspath, link_target);
  for (back = 0; strncmp(&link_target[back * 3], "../", 3) == 0; back++)
    ;
  udev_log_null(udev, "base '%s', tail '%s', back %i\n", syspath, &link_target[back * 3], back);
  for (i = 0; i <= back; i++) {
    char *pos = strrchr(syspath, '/');
    if (pos == NULL)
      return -1;
    pos[0] = '\0';
  }
  udev_log_null(udev, "after moving back '%s'\n", syspath);
  util_strlcat(syspath, "/", size);
  util_strlcat(syspath, &link_target[back * 3], size);
  return 0;
}
```