user: 这段汇编代码用C语言表示是什么样的？

```asm
<tgoto>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x40,%rsp
  mov    %rdi,-0x38(%rbp)
  mov    %esi,-0x3c(%rbp)
  mov    %edx,-0x40(%rbp)
  mov    %fs:0x28,%rax
  mov    %rax,-0x8(%rbp)
  xor    %eax,%eax
  movl   $0x0,-0x2c(%rbp)
  mov    -0x40(%rbp),%eax
  mov    %eax,-0x28(%rbp)
  lea    D86(%rip),%rax
  mov    %rax,-0x20(%rbp)
  mov    -0x20(%rbp),%rax
  add    $0x14,%rax
  mov    %rax,-0x18(%rbp)
  jmp    L8
L289:
  cmpb   $0x25,-0x2d(%rbp)
  jne    L106
  mov    -0x38(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x38(%rbp)
  movzbl (%rax),%eax
  mov    %al,-0x2d(%rbp)
  cmpb   $0x25,-0x2d(%rbp)
  jne    L87
L106:
  mov    -0x20(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x20(%rbp)
  movzbl -0x2d(%rbp),%edx
  mov    %dl,(%rax)
  mov    -0x20(%rbp),%rax
  cmp    -0x18(%rbp),%rax
  jb     L8
  mov    D85(%rip),%rax
  mov    (%rax),%edx
  mov    D69(%rip),%rax
  mov    %edx,(%rax)
  mov    $0x0,%eax
  jmp    L221
L87:
  movsbl -0x2d(%rbp),%eax
  cmp    $0x72,%eax
  je     L173
  cmp    $0x72,%eax
  jg     L229
  cmp    $0x69,%eax
  je     L157
  cmp    $0x69,%eax
  jg     L229
  cmp    $0x33,%eax
  jg     L271
  cmp    $0x32,%eax
  jge    L115
  jmp    L229
L271:
  cmp    $0x64,%eax
  jne    L229
L115:
  movl   $0x0,-0x24(%rbp)
L187:
  mov    -0x28(%rbp),%edx
  movslq %edx,%rax
  imul   $0x66666667,%rax,%rax
  shr    $0x20,%rax
  sar    $0x2,%eax
  mov    %edx,%esi
  sar    $0x1f,%esi
  sub    %esi,%eax
  mov    %eax,%ecx
  mov    %ecx,%eax
  shl    $0x2,%eax
  add    %ecx,%eax
  add    %eax,%eax
  mov    %edx,%ecx
  sub    %eax,%ecx
  mov    -0x24(%rbp),%eax
  lea    0x1(%rax),%edx
  mov    %edx,-0x24(%rbp)
  or     $0x30,%ecx
  mov    %ecx,%edx
  cltq
  mov    %dl,-0xe(%rbp,%rax,1)
  mov    -0x28(%rbp),%eax
  movslq %eax,%rdx
  imul   $0x66666667,%rdx,%rdx
  shr    $0x20,%rdx
  sar    $0x2,%edx
  sar    $0x1f,%eax
  mov    %eax,%ecx
  mov    %edx,%eax
  sub    %ecx,%eax
  mov    %eax,-0x28(%rbp)
  cmpl   $0x0,-0x28(%rbp)
  jne    L187
  cmpb   $0x64,-0x2d(%rbp)
  je     L217
  movzbl -0x2d(%rbp),%eax
  sub    $0x30,%eax
  mov    %al,-0x2d(%rbp)
  movsbl -0x2d(%rbp),%eax
  cmp    %eax,-0x24(%rbp)
  jle    L230
  mov    D48(%rip),%rax
  mov    (%rax),%edx
  mov    D69(%rip),%rax
  mov    %edx,(%rax)
  mov    $0x0,%eax
  jmp    L221
L211:
  mov    -0x24(%rbp),%eax
  lea    0x1(%rax),%edx
  mov    %edx,-0x24(%rbp)
  cltq
  movb   $0x30,-0xe(%rbp,%rax,1)
L230:
  movsbl -0x2d(%rbp),%eax
  cmp    %eax,-0x24(%rbp)
  jl     L211
L217:
  mov    -0x24(%rbp),%eax
  movslq %eax,%rdx
  mov    -0x20(%rbp),%rax
  add    %rdx,%rax
  cmp    %rax,-0x18(%rbp)
  ja     L57
  mov    D85(%rip),%rax
  mov    (%rax),%edx
  mov    D69(%rip),%rax
  mov    %edx,(%rax)
  mov    $0x0,%eax
  jmp    L221
L57:
  subl   $0x1,-0x24(%rbp)
  mov    -0x20(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x20(%rbp)
  mov    -0x24(%rbp),%edx
  movslq %edx,%rdx
  movzbl -0xe(%rbp,%rdx,1),%edx
  mov    %dl,(%rax)
  cmpl   $0x0,-0x24(%rbp)
  jne    L57
  jmp    L68
L173:
  movl   $0x0,-0x2c(%rbp)
  jmp    L68
L157:
  addl   $0x1,-0x3c(%rbp)
  addl   $0x1,-0x40(%rbp)
  addl   $0x1,-0x28(%rbp)
  jmp    L8
L229:
  mov    D48(%rip),%rax
  mov    (%rax),%edx
  mov    D69(%rip),%rax
  mov    %edx,(%rax)
  mov    $0x0,%eax
  jmp    L221
L68:
  mov    $0x1,%eax
  sub    -0x2c(%rbp),%eax
  mov    %eax,-0x2c(%rbp)
  cmpl   $0x0,-0x2c(%rbp)
  je     L48
  mov    -0x3c(%rbp),%eax
  jmp    L136
L48:
  mov    -0x40(%rbp),%eax
L136:
  mov    %eax,-0x28(%rbp)
L8:
  mov    -0x38(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x38(%rbp)
  movzbl (%rax),%eax
  mov    %al,-0x2d(%rbp)
  cmpb   $0x0,-0x2d(%rbp)
  jne    L289
  mov    -0x20(%rbp),%rax
  movb   $0x0,(%rax)
  lea    D86(%rip),%rax
L221:
  mov    -0x8(%rbp),%rdx
  sub    %fs:0x28,%rdx
  je     L3
  call   <__stack_chk_fail@plt>
L3:
  leave
  ret
```

assistant: ```c
char *tgoto(const char *cap, int col, int line) {
  static char buf[20];
  char *p, *e, c, dbuf[6];
  int oncol = 0, which = line, i;
  p = buf;
  e = p + sizeof(buf);
  while ((c = *cap++)) {
    if (c != '%' || ((c = *cap++) == '%')) {
      *p++ = c;
      if (p >= e) {
        errno = E2BIG;
        return NULL;
      }
      continue;
    }
    switch (c) {
    case '3':
    case '2':
    case 'd':
      i = 0;
      do
        dbuf[i++] = which % 10 | '0';
      while ((which /= 10));
      if (c != 'd') {
        c -= '0';
        if (i > c) {
          errno = EINVAL;
          return NULL;
        }
        while (i < c)
          dbuf[i++] = '0';
      }
      if (p + i >= e) {
        errno = E2BIG;
        return NULL;
      }
      do
        *p++ = dbuf[--i];
      while (i);
      break;
    case 'r':
      oncol = 0;
      break;
    case 'i':
      col++;
      line++;
      which++;
      continue;
    default:
      errno = EINVAL;
      return NULL;
    }
    oncol = 1 - oncol;
    which = oncol ? col : line;
  }
  *p = '\0';
  return buf;
}
```