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

```asm
<lily_lily_to_html>:
  endbr64
  push   %r15
  push   %r14
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  sub    $0x38,%rsp
  mov    %rdi,%r14
  call   <strlen@plt>
  mov    %rax,0x10(%rsp)
  lea    (%rax,%rax,2),%rax
  lea    0x1(%rax,%rax,1),%rsi
  mov    D225(%rip),%rdi
  call   <realloc@plt>
  mov    %rax,D85(%rip)
  test   %rax,%rax
  je     L43
L393:
  mov    $0x0,%ebp
  cmpq   $0x0,0x10(%rsp)
  je     L74
  mov    $0x20,%esi
  mov    %r14,%rdi
  call   <strchr@plt>
  mov    %rax,(%rsp)
  lea    0x1(%r14),%r13
  movzbl 0x1(%r14),%eax
  cmp    $0x20,%al
  sete   0x23(%rsp)
  test   $0xdf,%al
  sete   %dl
  and    $0xfffffffd,%eax
  cmp    $0x2c,%al
  sete   %al
  or     %edx,%eax
  movzbl %al,%eax
  mov    %eax,0xc(%rsp)
  mov    %r14,%r12
  movl   $0x0,0x24(%rsp)
  movl   $0x0,0x2c(%rsp)
  movl   $0x0,0x28(%rsp)
  mov    $0x0,%r15d
  mov    $0x0,%ebp
  movq   $0x1,0x18(%rsp)
  movl   $0x1,0x8(%rsp)
  jmp    L209
L43:
  call   <abort@plt>
  jmp    L393
L457:
  mov    %r14,%rdi
  call   <strlen@plt>
  add    %r14,%rax
  mov    %rax,(%rsp)
  jmp    L449
L426:
  cmp    $0x5f,%al
  jne    L275
  mov    $0x5f,%esi
  mov    %r13,%rdi
  call   <strchr@plt>
  test   %rax,%rax
  je     L9
  movzbl 0x1(%rax),%ecx
  test   $0xdf,%cl
  sete   %dl
  and    $0xfffffffd,%ecx
  cmp    $0x2c,%cl
  sete   %cl
  or     %ecx,%edx
  movzbl %dl,%edx
L352:
  cmpl   $0x0,0x24(%rsp)
  je     L15
  cmpl   $0x0,0xc(%rsp)
  jne    L157
L15:
  cmpl   $0x0,0x24(%rsp)
  jne    L77
  cmpl   $0x0,0x8(%rsp)
  je     L77
  cmp    %rax,(%rsp)
  jbe    L77
  test   %edx,%edx
  jne    L515
L77:
  movzbl (%r12),%ecx
  movslq %ebp,%rax
  mov    D85(%rip),%rdx
  mov    %cl,(%rdx,%rax,1)
  lea    0x1(%rbp),%ebp
  jmp    L528
  mov    $0x2a,%esi
  mov    %r13,%rdi
  call   <strchr@plt>
  test   %rax,%rax
  je     L280
  movzbl 0x1(%rax),%ecx
  test   $0xdf,%cl
  sete   %dl
  and    $0xfffffffd,%ecx
  cmp    $0x2c,%cl
  sete   %cl
  or     %ecx,%edx
  movzbl %dl,%edx
L165:
  cmpl   $0x0,0x28(%rsp)
  setne  %sil
  cmpl   $0x0,0x8(%rsp)
  sete   %cl
  test   %cl,%sil
  je     L20
  cmpl   $0x0,0xc(%rsp)
  jne    L460
L20:
  cmpl   $0x0,0x8(%rsp)
  je     L288
  mov    0xc(%rsp),%esi
  or     0x28(%rsp),%esi
  sete   %cl
  cmp    %rax,(%rsp)
  seta   %al
  test   %al,%cl
  je     L288
  test   %edx,%edx
  jne    L337
L288:
  movzbl (%r12),%ecx
  movslq %ebp,%rax
  mov    D85(%rip),%rdx
  mov    %cl,(%rdx,%rax,1)
  lea    0x1(%rbp),%ebp
  jmp    L528
L280:
  mov    (%rsp),%rax
  mov    $0x0,%edx
  jmp    L165
L460:
  movslq %ebp,%rdi
  add    D85(%rip),%rdi
  mov    $0x4,%edx
  lea    D85(%rip),%rsi
  call   <memcpy@plt>
  add    $0x4,%ebp
  movl   $0x0,0x28(%rsp)
  jmp    L528
L337:
  movslq %ebp,%rdi
  add    D85(%rip),%rdi
  mov    $0x3,%edx
  lea    D297(%rip),%rsi
  call   <memcpy@plt>
  add    $0x3,%ebp
  mov    0x8(%rsp),%eax
  mov    %eax,0x28(%rsp)
  jmp    L528
  mov    $0x2f,%esi
  mov    %r13,%rdi
  call   <strchr@plt>
  test   %rax,%rax
  je     L459
  movzbl 0x1(%rax),%ecx
  mov    %ecx,%edx
  and    $0xfffffffd,%edx
  cmp    $0x2c,%dl
  sete   %dl
  test   $0xdf,%cl
  sete   %cl
  or     %ecx,%edx
  movzbl %dl,%edx
L322:
  movzbl 0x8(%rsp),%ecx
  movzbl 0xc(%rsp),%esi
  test   %cl,%cl
  je     L427
  test   %sil,%sil
  jne    L266
L427:
  cmpl   $0x0,0x2c(%rsp)
  je     L29
  test   %sil,%sil
  jne    L346
L29:
  cmpl   $0x0,0x2c(%rsp)
  jne    L350
  test   %cl,%cl
  je     L350
  cmp    %rax,(%rsp)
  jbe    L350
  test   %edx,%edx
  jne    L263
L350:
  movzbl (%r12),%ecx
  movslq %ebp,%rax
  mov    D85(%rip),%rdx
  mov    %cl,(%rdx,%rax,1)
  lea    0x1(%rbp),%ebp
  jmp    L528
L459:
  mov    (%rsp),%rax
  mov    $0x0,%edx
  jmp    L322
L266:
  movslq %ebp,%rdi
  add    D85(%rip),%rdi
  mov    $0x4,%edx
  lea    D11(%rip),%rsi
  call   <memcpy@plt>
  add    $0x4,%ebp
  mov    0x18(%rsp),%r15
  jmp    L528
L346:
  movslq %ebp,%rdi
  add    D85(%rip),%rdi
  mov    $0x4,%edx
  lea    D295(%rip),%rsi
  call   <memcpy@plt>
  add    $0x4,%ebp
  movl   $0x0,0x2c(%rsp)
  jmp    L528
L263:
  movslq %ebp,%rdi
  add    D85(%rip),%rdi
  mov    $0x3,%edx
  lea    D17(%rip),%rsi
  call   <memcpy@plt>
  add    $0x3,%ebp
  movl   $0x1,0x2c(%rsp)
  jmp    L528
L9:
  mov    (%rsp),%rax
  mov    $0x0,%edx
  jmp    L352
L157:
  movslq %ebp,%rdi
  add    D85(%rip),%rdi
  mov    $0x4,%edx
  lea    D162(%rip),%rsi
  call   <memcpy@plt>
  add    $0x4,%ebp
  movl   $0x0,0x24(%rsp)
  jmp    L528
L515:
  movslq %ebp,%rdi
  add    D85(%rip),%rdi
  mov    $0x3,%edx
  lea    D114(%rip),%rsi
  call   <memcpy@plt>
  add    $0x3,%ebp
  movl   $0x1,0x24(%rsp)
  jmp    L528
  movslq %ebp,%rdi
  add    D85(%rip),%rdi
  mov    $0x5,%edx
  lea    D165(%rip),%rsi
  call   <memcpy@plt>
  add    $0x5,%ebp
L528:
  lea    0x1(%r15),%rbx
  cmp    %rbx,0x10(%rsp)
  jbe    L74
  lea    (%r14,%rbx,1),%r12
  mov    $0x20,%esi
  mov    %r12,%rdi
  call   <strchr@plt>
  mov    %rax,(%rsp)
  lea    0x2(%r15),%rax
  mov    %rax,0x18(%rsp)
  lea    (%r14,%rax,1),%r13
  movzbl 0x0(%r13),%eax
  cmp    $0x20,%al
  sete   0x23(%rsp)
  test   $0xdf,%al
  sete   %dl
  and    $0xfffffffd,%eax
  cmp    $0x2c,%al
  sete   %al
  or     %edx,%eax
  movzbl %al,%eax
  mov    %eax,0xc(%rsp)
  movl   $0x1,0x8(%rsp)
  test   %rbx,%rbx
  je     L429
  cmpb   $0x20,(%r14,%r15,1)
  sete   %al
  movzbl %al,%eax
  mov    %eax,0x8(%rsp)
L429:
  mov    %rbx,%r15
L209:
  cmpq   $0x0,(%rsp)
  je     L457
L449:
  movzbl (%r12),%eax
  cmp    $0x3e,%al
  jg     L426
  cmp    $0x1f,%al
  jle    L275
  lea    -0x20(%rax),%edx
  cmp    $0x1e,%dl
  ja     L275
  movzbl %dl,%edx
  lea    D149(%rip),%rcx
  movslq (%rcx,%rdx,4),%rdx
  add    %rcx,%rdx
  notrack jmp *%rdx
  movslq %ebp,%rdi
  add    D85(%rip),%rdi
  mov    $0x4,%edx
  lea    D147(%rip),%rsi
  call   <memcpy@plt>
  add    $0x4,%ebp
  jmp    L528
  movslq %ebp,%rdi
  add    D85(%rip),%rdi
  mov    $0x4,%edx
  lea    D171(%rip),%rsi
  call   <memcpy@plt>
  add    $0x4,%ebp
  jmp    L528
  cmpb   $0x0,0x23(%rsp)
  jne    L148
  movslq %ebp,%rax
  mov    D85(%rip),%rdx
  movb   $0x20,(%rdx,%rax,1)
  lea    0x1(%rbp),%ebp
  jmp    L528
L148:
  movslq %ebp,%rdi
  add    D85(%rip),%rdi
  mov    $0x6,%edx
  lea    D72(%rip),%rsi
  call   <memcpy@plt>
  add    $0x6,%ebp
  jmp    L528
L275:
  movslq %ebp,%rdx
  mov    D85(%rip),%rcx
  mov    %al,(%rcx,%rdx,1)
  lea    0x1(%rbp),%ebp
  jmp    L528
L74:
  mov    D85(%rip),%rax
  movslq %ebp,%rbp
  movb   $0x0,(%rax,%rbp,1)
  add    $0x38,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
```

tool_calls: name: extract_symbolic_data
arguments: tag: D85
datatype: string
name: extract_symbolic_data
arguments: tag: D297
datatype: string
name: extract_symbolic_data
arguments: tag: D11
datatype: string
name: extract_symbolic_data
arguments: tag: D295
datatype: string
name: extract_symbolic_data
arguments: tag: D17
datatype: string
name: extract_symbolic_data
arguments: tag: D162
datatype: string
name: extract_symbolic_data
arguments: tag: D114
datatype: string
name: extract_symbolic_data
arguments: tag: D165
datatype: string
name: extract_symbolic_data
arguments: tag: D147
datatype: string
name: extract_symbolic_data
arguments: tag: D171
datatype: string
name: extract_symbolic_data
arguments: tag: D72
datatype: string

tool: D85: </b>

tool: D297: <b>

tool: D11: <br>

tool: D295: </i>

tool: D17: <i>

tool: D162: </u>

tool: D114: <u>

tool: D165: &amp;

tool: D147: &lt;

tool: D171: &gt;

tool: D72: &nbsp;

assistant: ```c
char *lily_lily_to_html(const char *const string) {
  static char *output = NULL;
  int o = 0;
  size_t l, i = 0;
  int inbold = 0, initalics = 0, inunderline = 0;
  l = strlen(string);
  output = realloc(output, (l * 6) + 1);
  if (output == NULL)
    abort();
  while (i < l) {
    const char *sp = strchr(string + i, ' '), *ch;
    int word_end = ((string[i + 1] == ' ') || (string[i + 1] == ',') || (string[i + 1] == '.') || (string[i + 1] == 0)), word_begin = ((i == 0) || (string[i - 1] == ' ')), ch_end = 0;
    if (sp == NULL)
      sp = string + strlen(string);
    switch (string[i]) {
    case '*':
      if ((ch = strchr(string + i + 1, '*')) == NULL)
        ch = sp;
      else
        ch_end = ((ch[1] == ' ') || (ch[1] == ',') || (ch[1] == '.') || (ch[1] == 0));
      if (inbold && !word_begin && word_end) {
        inbold = 0;
        memcpy(&output[o], "</b>", 4);
        o += 4;
      } else if (!inbold && word_begin && !word_end && (ch < sp) && ch_end) {
        inbold = 1;
        memcpy(&output[o], "<b>", 3);
        o += 3;
      } else
        output[o++] = string[i];
      break;
    case '/':
      if ((ch = strchr(string + i + 1, '/')) == NULL)
        ch = sp;
      else
        ch_end = ((ch[1] == ' ') || (ch[1] == ',') || (ch[1] == '.') || (ch[1] == 0));
      if (word_begin && word_end) {
        i++;
        memcpy(&output[o], "<br>", 4);
        o += 4;
      } else if (initalics && word_end) {
        memcpy(&output[o], "</i>", 4);
        o += 4;
        initalics = 0;
      } else if (!initalics && word_begin && (ch < sp) && ch_end) {
        memcpy(&output[o], "<i>", 3);
        o += 3;
        initalics = 1;
      } else
        output[o++] = string[i];
      break;
    case '_':
      if ((ch = strchr(string + i + 1, '_')) == NULL)
        ch = sp;
      else
        ch_end = ((ch[1] == ' ') || (ch[1] == ',') || (ch[1] == '.') || (ch[1] == 0));
      if (inunderline && word_end) {
        memcpy(&output[o], "</u>", 4);
        o += 4;
        inunderline = 0;
      } else if (!inunderline && word_begin && (ch < sp) && ch_end) {
        memcpy(&output[o], "<u>", 3);
        o += 3;
        inunderline = 1;
      } else
        output[o++] = string[i];
      break;
    case '&':
      memcpy(&output[o], "&amp;", 5);
      o += 5;
      break;
    case '<':
      memcpy(&output[o], "&lt;", 4);
      o += 4;
      break;
    case '>':
      memcpy(&output[o], "&gt;", 4);
      o += 4;
      break;
    case ' ':
      if (string[i + 1] == ' ') {
        memcpy(&output[o], "&nbsp;", 6);
        o += 6;
      } else
        output[o++] = string[i];
      break;
    default:
      output[o++] = string[i];
      break;
    }
    i++;
  }
  output[o] = '\0';
  return (output);
}
```