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

```asm
<evsetup>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x460,%rsp
  mov    %rdi,-0x448(%rbp)
  mov    %rsi,-0x450(%rbp)
  mov    %edx,-0x454(%rbp)
  mov    %ecx,-0x458(%rbp)
  mov    %r8d,-0x45c(%rbp)
  mov    %r9d,-0x460(%rbp)
  mov    %fs:0x28,%rax
  mov    %rax,-0x8(%rbp)
  xor    %eax,%eax
  mov    -0x448(%rbp),%rdx
  lea    -0x410(%rbp),%rax
  mov    %rdx,%rcx
  lea    D38(%rip),%rdx
  mov    $0x400,%esi
  mov    %rax,%rdi
  call   <snprintf@plt>
  lea    -0x410(%rbp),%rax
  lea    D1(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <fopen@plt>
  mov    %rax,-0x428(%rbp)
  cmpq   $0x0,-0x428(%rbp)
  jne    L14
  lea    -0x410(%rbp),%rax
  mov    %rax,%rdx
  lea    D21(%rip),%rax
  mov    %rax,%rsi
  mov    $0x1,%edi
  mov    $0x0,%eax
  call   <err@plt>
L14:
  lea    -0x440(%rbp),%rdx
  mov    -0x428(%rbp),%rax
  lea    D12(%rip),%rcx
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <fscanf@plt>
  mov    %eax,-0x43c(%rbp)
  cmpl   $0x1,-0x43c(%rbp)
  sete   %al
  movzbl %al,%eax
  mov    %eax,%edi
  call   <assert@plt>
  mov    -0x428(%rbp),%rax
  mov    %rax,%rdi
  call   <fclose@plt>
  movq   $0x0,-0x420(%rbp)
  movq   $0x0,-0x418(%rbp)
  movl   $0x10,-0x420(%rbp)
  mov    -0x440(%rbp),%eax
  mov    %eax,-0x41c(%rbp)
  mov    -0x458(%rbp),%eax
  shl    $0x8,%eax
  or     -0x454(%rbp),%eax
  mov    %eax,-0x418(%rbp)
  mov    -0x45c(%rbp),%eax
  mov    %eax,-0x438(%rbp)
  mov    -0x460(%rbp),%eax
  mov    %eax,-0x434(%rbp)
  mov    $0x20,%edx
  mov    -0x434(%rbp),%eax
  mov    %edx,%ecx
  shl    %cl,%eax
  or     %eax,-0x438(%rbp)
  mov    -0x438(%rbp),%eax
  mov    %eax,-0x414(%rbp)
  movl   $0x0,-0x430(%rbp)
  movl   $0xffffffff,-0x42c(%rbp)
  mov    -0x430(%rbp),%edx
  mov    -0x42c(%rbp),%esi
  lea    -0x420(%rbp),%rax
  mov    $0x0,%r8d
  mov    $0xffffffff,%ecx
  mov    %rax,%rdi
  call   <perf_event_open@plt>
  mov    -0x450(%rbp),%rdx
  mov    %eax,(%rdx)
  mov    -0x450(%rbp),%rax
  mov    (%rax),%eax
  cmp    $0xffffffff,%eax
  jne    L28
  mov    -0x418(%rbp),%ecx
  mov    -0x448(%rbp),%rdx
  mov    -0x430(%rbp),%eax
  mov    %ecx,%r8d
  mov    %rdx,%rcx
  mov    %eax,%edx
  lea    D43(%rip),%rax
  mov    %rax,%rsi
  mov    $0x1,%edi
  mov    $0x0,%eax
  call   <err@plt>
L28:
  nop
  mov    -0x8(%rbp),%rax
  sub    %fs:0x28,%rax
  je     L22
  call   <__stack_chk_fail@plt>
L22:
  leave
  ret
```

tool_calls: name: unpack_data
arguments: label: D38
type_guessed: string
name: unpack_data
arguments: label: D1
type_guessed: string
name: unpack_data
arguments: label: D21
type_guessed: string
name: unpack_data
arguments: label: D12
type_guessed: string
name: unpack_data
arguments: label: D43
type_guessed: string

tool: D38: %s/type

tool: D1: r

tool: D21: open %s

tool: D12: %d

tool: D43: CPU %d, box %s, event 0x%lx

assistant: ```c
void evsetup(const char *ename, int *fd, unsigned int event, unsigned int umask, unsigned int filter0, unsigned int filter1) {
  char fname[1024];
  snprintf(fname, sizeof(fname), "%s/type", ename);
  FILE *fp = fopen(fname, "r");
  if (fp == 0) {
    err(1, "open %s", fname);
  }
  int type;
  int ret = fscanf(fp, "%d", &type);
  uint64_t filter0_64;
  uint64_t filter1_64;
  assert(ret == 1);
  fclose(fp);
  struct perf_event_attr hw = {};
  hw.size = sizeof(hw);
  hw.type = type;
  hw.config = event | (umask << 8);
  filter0_64 = (uint64_t)filter0;
  filter1_64 = (uint64_t)filter1;
  filter0_64 |= filter1_64 << 32;
  hw.config1 = filter0_64;
  int cpu = 0;
  int pid = -1;
  *fd = perf_event_open(&hw, pid, cpu, -1, 0);
  if (*fd == -1) {
    err(1, "CPU %d, box %s, event 0x%lx", cpu, ename, hw.config);
  }
}
```