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

```asm
<do_title_expn>:
  endbr64
  push   %r15
  push   %r14
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  sub    $0x138,%rsp
  mov    %rdi,%r14
  mov    %rdx,%rbx
  mov    %rcx,0x10(%rsp)
  mov    %fs:0x28,%rax
  mov    %rax,0x128(%rsp)
  xor    %eax,%eax
  lea    -0x1(%rsi),%eax
  mov    %eax,0xc(%rsp)
  movb   $0x0,(%rdi)
  mov    %eax,%r12d
  mov    $0x0,%edx
  test   %eax,%eax
  jg     L425
L268:
  test   %r12d,%r12d
  mov    $0x0,%eax
  cmovs  %eax,%r12d
  mov    0xc(%rsp),%eax
  sub    %r12d,%eax
  cltq
  movb   $0x0,(%r14,%rax,1)
  mov    0x128(%rsp),%rax
  sub    %fs:0x28,%rax
  jne    L234
  add    $0x138,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
L14:
  lea    0x1(%rbx),%rbp
  cmpb   $0x0,0x1(%rbx)
  je     L0
L151:
  movzbl 0x1(%rbx),%edi
  cmp    $0x28,%dil
  jne    L53
  cmpb   $0x0,0x2(%rbx)
  je     L329
L361:
  movsbl 0x2(%rbx),%edi
  mov    0x10(%rsp),%rsi
  call   <title_expn_subs@plt>
  mov    %rax,0x18(%rsp)
  cmpb   $0x0,0x3(%rbx)
  je     L394
L319:
  movzbl 0x3(%rbx),%r15d
  lea    0x4(%rbx),%rbp
  cmpb   $0x0,0x4(%rbx)
  je     L386
L225:
  mov    $0x0,%ebx
  mov    $0x0,%r13d
  cmpq   $0x0,0x18(%rsp)
  jne    L10
  jmp    L493
L0:
  lea    D84(%rip),%rdi
  call   <fatal@plt>
  jmp    L151
L329:
  lea    D84(%rip),%rdi
  call   <fatal@plt>
  jmp    L361
L394:
  lea    D84(%rip),%rdi
  call   <fatal@plt>
  jmp    L319
L386:
  lea    D84(%rip),%rdi
  call   <fatal@plt>
  jmp    L225
L220:
  cmp    $0xfe,%ebx
  je     L427
L482:
  movzbl 0x0(%rbp),%eax
  mov    %al,0x20(%rsp,%rbx,1)
  cmp    $0x5c,%al
  sete   %r13b
  movzbl %r13b,%r13d
  add    $0x1,%rbp
  cmpb   $0x0,0x0(%rbp)
  je     L395
L91:
  add    $0x1,%rbx
L10:
  mov    %ebx,%eax
  test   %r13w,%r13w
  jne    L220
  cmp    %r15b,0x0(%rbp)
  jne    L220
  cltq
  movb   $0x0,0x20(%rsp,%rax,1)
  mov    %r13d,%r15d
  mov    %rbp,%rbx
  jmp    L396
L427:
  lea    D92(%rip),%rdi
  call   <fatal@plt>
  jmp    L482
L395:
  lea    D84(%rip),%rdi
  call   <fatal@plt>
  jmp    L91
L497:
  mov    %r13d,%r15d
L48:
  add    $0x1,%rbx
  cmpb   $0x0,(%rbx)
  je     L375
L396:
  test   %r15w,%r15w
  jne    L497
  movzbl (%rbx),%eax
  cmp    $0x29,%al
  je     L334
  cmp    $0x5c,%al
  sete   %r15b
  movzbl %r15b,%r15d
  jmp    L48
L375:
  lea    D84(%rip),%rdi
  call   <fatal@plt>
  jmp    L396
L74:
  mov    $0x0,%r13d
L236:
  add    $0x1,%rbp
  cmpb   $0x0,0x0(%rbp)
  je     L194
L493:
  test   %r13w,%r13w
  jne    L74
  movzbl 0x0(%rbp),%eax
  cmp    %r15b,%al
  je     L419
  cmp    $0x5c,%al
  sete   %r13b
  movzbl %r13b,%r13d
  jmp    L236
L194:
  lea    D84(%rip),%rdi
  call   <fatal@plt>
  jmp    L493
L419:
  lea    0x1(%rbp),%rbx
  cmpb   $0x0,0x1(%rbp)
  je     L316
L188:
  mov    $0x0,%ebp
  jmp    L217
L316:
  lea    D84(%rip),%rdi
  call   <fatal@plt>
  jmp    L188
L344:
  cmp    $0xfe,%ebp
  je     L426
L474:
  movzbl (%rbx),%eax
  mov    %al,0x20(%rsp,%rbp,1)
  cmp    $0x5c,%al
  sete   %r13b
  movzbl %r13b,%r13d
  add    $0x1,%rbx
  cmpb   $0x0,(%rbx)
  je     L451
L207:
  add    $0x1,%rbp
L217:
  mov    %ebp,%eax
  test   %r13w,%r13w
  jne    L344
  cmpb   $0x29,(%rbx)
  jne    L344
  cltq
  movb   $0x0,0x20(%rsp,%rax,1)
L334:
  movslq 0xc(%rsp),%rax
  movslq %r12d,%rdx
  sub    %rdx,%rax
  lea    (%r14,%rax,1),%rbp
  lea    0x20(%rsp),%rdx
  mov    0x10(%rsp),%rcx
  mov    %r12d,%esi
  mov    %rbp,%rdi
  call   <do_title_expn>
  mov    %rbp,%rdi
  call   <strlen@plt>
  sub    %eax,%r12d
  mov    $0x0,%edx
  jmp    L87
L426:
  lea    D50(%rip),%rdi
  call   <fatal@plt>
  jmp    L474
L451:
  lea    D84(%rip),%rdi
  call   <fatal@plt>
  jmp    L207
L53:
  movsbl %dil,%edi
  mov    0x10(%rsp),%rsi
  call   <title_expn_subs@plt>
  mov    %rax,%rbx
  test   %rax,%rax
  je     L29
  lea    -0x1(%r12),%edx
  mov    %rax,%rsi
  mov    %r14,%rdi
  call   <strncat@plt>
  mov    %rbx,%rdi
  call   <strlen@plt>
  sub    %eax,%r12d
  mov    %rbp,%rbx
  mov    $0x0,%edx
  jmp    L87
L212:
  mov    0xc(%rsp),%edx
  sub    %r12d,%edx
  movslq %edx,%rdx
  mov    %al,(%r14,%rdx,1)
  movb   $0x0,0x1(%r14,%rdx,1)
  sub    $0x1,%r12d
  mov    $0x0,%edx
L87:
  add    $0x1,%rbx
  test   %r12d,%r12d
  jle    L268
L425:
  movzbl (%rbx),%eax
  test   %al,%al
  je     L268
  test   %dx,%dx
  sete   %cl
  cmp    $0x25,%al
  jne    L106
  test   %cl,%cl
  jne    L14
L106:
  cmp    $0x5c,%al
  jne    L212
  mov    $0x1,%edx
  test   %cl,%cl
  je     L212
  jmp    L87
L29:
  mov    %rbp,%rbx
  mov    $0x0,%edx
  jmp    L87
L234:
  call   <__stack_chk_fail@plt>
```

tool_calls: name: retrieve_data
arguments: data_label: D84
type_guessed: string
name: retrieve_data
arguments: data_label: D92
type_guessed: string
name: retrieve_data
arguments: data_label: D50
type_guessed: string

tool: D84: Unexpected end of title expression

tool: D92: Nested ternary expression too long

tool: D50: Ternary expression too long

assistant: ```c
void do_title_expn(char *dest, int size, const char *fmt, const struct file_tags *tags) {
  const char *h;
  int free = --size;
  short escape = 0;
  dest[0] = 0;
  while (free > 0 && *fmt) {
    if (*fmt == '%' && !escape) {
      if ((*++fmt) == '\0')
        fatal("Unexpected end of title expression");
      if (*fmt == '(') {
        char separator, expr[256];
        int expr_pos = 0;
        if ((*++fmt) == '\0')
          fatal("Unexpected end of title expression");
        h = title_expn_subs(*fmt, tags);
        if ((*++fmt) == '\0')
          fatal("Unexpected end of title expression");
        separator = *fmt;
        if ((*++fmt) == '\0')
          fatal("Unexpected end of title expression");
        if (h) {
          while (escape || *fmt != separator) {
            if (expr_pos == sizeof(expr) - 2)
              fatal("Nested ternary expression too long");
            expr[expr_pos++] = *fmt;
            if (*fmt == '\\')
              escape = 1;
            else
              escape = 0;
            if ((*++fmt) == '\0')
              fatal("Unexpected end of title expression");
          }
          expr[expr_pos] = '\0';
          while (escape || *fmt != ')') {
            if (escape)
              escape = 0;
            else if (*fmt == '\\')
              escape = 1;
            if ((*++fmt) == '\0')
              fatal("Unexpected end of title expression");
          }
        } else {
          while (escape || *fmt != separator) {
            if (escape)
              escape = 0;
            else if (*fmt == '\\')
              escape = 1;
            if ((*++fmt) == '\0')
              fatal("Unexpected end of title expression");
          }
          if ((*++fmt) == '\0')
            fatal("Unexpected end of title expression");
          while (escape || *fmt != ')') {
            if (expr_pos == sizeof(expr) - 2)
              fatal("Ternary expression too long");
            expr[expr_pos++] = *fmt;
            if (*fmt == '\\')
              escape = 1;
            else
              escape = 0;
            if ((*++fmt) == '\0')
              fatal("Unexpected end of title expression");
          }
          expr[expr_pos] = '\0';
        }
        do_title_expn((dest + size - free), free, expr, tags);
        free -= strlen(dest + size - free);
      } else {
        h = title_expn_subs(*fmt, tags);
        if (h) {
          strncat(dest, h, free - 1);
          free -= strlen(h);
        }
      }
    } else if (*fmt == '\\' && !escape)
      escape = 1;
    else {
      dest[size - free] = *fmt;
      dest[size - free + 1] = 0;
      --free;
      escape = 0;
    }
    fmt++;
  }
  free = free < 0 ? 0 : free;
  dest[size - free] = '\0';
}
```