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

```asm
<get_fs_ids>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x50,%rsp
  mov    %rdi,-0x48(%rbp)
  mov    %rsi,-0x50(%rbp)
  mov    %fs:0x28,%rax
  mov    %rax,-0x8(%rbp)
  xor    %eax,%eax
  movl   $0x0,-0x28(%rbp)
  movl   $0x0,-0x24(%rbp)
  movq   $0x0,-0x20(%rbp)
  movq   $0x0,-0x18(%rbp)
  mov    -0x50(%rbp),%rax
  movl   $0xffffffff,(%rax)
  mov    -0x50(%rbp),%rax
  mov    (%rax),%edx
  mov    -0x48(%rbp),%rax
  mov    %edx,(%rax)
  lea    D33(%rip),%rax
  mov    %rax,%rsi
  lea    D16(%rip),%rax
  mov    %rax,%rdi
  call   <fopen@plt>
  mov    %rax,-0x10(%rbp)
  cmpq   $0x0,-0x10(%rbp)
  jne    L27
  mov    $0x0,%eax
  call   <abort@plt>
  jmp    L27
L78:
  cmpl   $0x0,-0x28(%rbp)
  jne    L91
  mov    -0x20(%rbp),%rax
  lea    -0x2c(%rbp),%rdi
  lea    -0x30(%rbp),%rsi
  lea    -0x34(%rbp),%rcx
  lea    -0x38(%rbp),%rdx
  mov    %rdi,%r9
  mov    %rsi,%r8
  lea    D25(%rip),%rsi
  mov    %rax,%rdi
  call   <sscanf@plt>
  cmp    $0x4,%eax
  jne    L91
  movl   $0x1,-0x28(%rbp)
  mov    -0x2c(%rbp),%eax
  mov    %eax,%edx
  mov    -0x48(%rbp),%rax
  mov    %edx,(%rax)
L91:
  cmpl   $0x0,-0x24(%rbp)
  jne    L52
  mov    -0x20(%rbp),%rax
  lea    -0x2c(%rbp),%rdi
  lea    -0x30(%rbp),%rsi
  lea    -0x34(%rbp),%rcx
  lea    -0x38(%rbp),%rdx
  mov    %rdi,%r9
  mov    %rsi,%r8
  lea    D11(%rip),%rsi
  mov    %rax,%rdi
  call   <sscanf@plt>
  cmp    $0x4,%eax
  jne    L52
  movl   $0x1,-0x24(%rbp)
  mov    -0x2c(%rbp),%eax
  mov    %eax,%edx
  mov    -0x50(%rbp),%rax
  mov    %edx,(%rax)
L52:
  cmpl   $0x0,-0x28(%rbp)
  je     L27
  cmpl   $0x0,-0x24(%rbp)
  jne    L17
L27:
  mov    -0x10(%rbp),%rdx
  lea    -0x18(%rbp),%rcx
  lea    -0x20(%rbp),%rax
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <getline@plt>
  cmp    $0xffffffff,%eax
  jne    L78
  jmp    L69
L17:
  nop
L69:
  mov    -0x20(%rbp),%rax
  test   %rax,%rax
  je     L101
  mov    -0x20(%rbp),%rax
  mov    %rax,%rdi
  call   <free@plt>
L101:
  cmpl   $0x0,-0x28(%rbp)
  je     L68
  cmpl   $0x0,-0x24(%rbp)
  je     L68
  mov    $0x0,%eax
  jmp    L104
L68:
  mov    $0xffffffff,%eax
L104:
  mov    -0x8(%rbp),%rdx
  sub    %fs:0x28,%rdx
  je     L8
  call   <__stack_chk_fail@plt>
L8:
  leave
  ret
```

tool_calls: name: disassemble_data
arguments: data_tag: D33
type_infered: string
name: disassemble_data
arguments: data_tag: D16
type_infered: string
name: disassemble_data
arguments: data_tag: D25
type_infered: string
name: disassemble_data
arguments: data_tag: D11
type_infered: string

tool: D33: r

tool: D16: /proc/self/status

tool: D25: Uid: %u %u %u %u

tool: D11: Gid: %u %u %u %u

assistant: ```c
int get_fs_ids(uid_t *fsuid, gid_t *fsgid) {
  unsigned r, e, s, fs;
  bool got_u = false, got_g = false;
  char *line = NULL;
  size_t len = 0;
  FILE *fp;
  *fsuid = *fsgid = -1;
  if (!((fp = fopen("/proc/self/status", "r")) != NULL))
    abort();
  while (getline(&line, &len, fp) != -1) {
    if (!got_u && sscanf(line, "Uid: %u %u %u %u", &r, &e, &s, &fs) == 4) {
      got_u = true;
      *fsuid = fs;
    }
    if (!got_g && sscanf(line, "Gid: %u %u %u %u", &r, &e, &s, &fs) == 4) {
      got_g = true;
      *fsgid = fs;
    }
    if (got_u && got_g)
      break;
  }
  if (line)
    free(line);
  return (got_u && got_g) ? 0 : -1;
}
```