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

```asm
<decode>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x70,%rsp
  mov    %rdi,-0x68(%rbp)
  mov    %fs:0x28,%rax
  mov    %rax,-0x8(%rbp)
  xor    %eax,%eax
  mov    -0x68(%rbp),%rax
  mov    %rax,%rdi
  call   <strlen@plt>
  mov    %rax,-0x30(%rbp)
  mov    -0x30(%rbp),%rax
  add    %eax,%eax
  mov    %eax,%edi
  call   <malloc@plt>
  mov    %rax,-0x58(%rbp)
  mov    -0x30(%rbp),%rax
  add    %rax,%rax
  mov    %rax,-0x50(%rbp)
  movq   $0x0,-0x48(%rbp)
  mov    -0x58(%rbp),%rax
  movb   $0x0,(%rax)
  movb   $0x0,-0x20(%rbp)
  cmpq   $0x0,-0x30(%rbp)
  jne    L118
  mov    -0x58(%rbp),%rax
  jmp    L67
L118:
  movq   $0x0,-0x40(%rbp)
  jmp    L62
L68:
  mov    -0x68(%rbp),%rdx
  mov    -0x40(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  movsbl %al,%eax
  mov    %eax,%edi
  call   <isdigit@plt>
  test   %rax,%rax
  je     L32
  mov    -0x68(%rbp),%rdx
  mov    -0x40(%rbp),%rax
  lea    (%rdx,%rax,1),%rcx
  lea    -0x20(%rbp),%rax
  mov    $0x1,%edx
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <strncat@plt>
  jmp    L18
L32:
  lea    -0x20(%rbp),%rax
  mov    %rax,%rdi
  call   <strlen@plt>
  test   %rax,%rax
  jle    L3
  lea    -0x20(%rbp),%rax
  mov    %rax,%rdi
  call   <atoi@plt>
  mov    %rax,-0x28(%rbp)
  movq   $0x0,-0x38(%rbp)
  jmp    L45
L93:
  mov    -0x68(%rbp),%rdx
  mov    -0x40(%rbp),%rax
  lea    (%rdx,%rax,1),%rcx
  mov    -0x58(%rbp),%rax
  mov    $0x1,%edx
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <strncat@plt>
  addq   $0x1,-0x48(%rbp)
  mov    -0x50(%rbp),%rax
  add    %rax,%rax
  movabs $0xaaaaaaaaaaaaaaab,%rdx
  mul    %rdx
  mov    %rdx,%rax
  shr    %rax
  cmp    %rax,-0x48(%rbp)
  jbe    L105
  mov    -0x50(%rbp),%rax
  lea    (%rax,%rax,1),%rdx
  mov    -0x58(%rbp),%rax
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <realloc@plt>
  mov    %rax,-0x58(%rbp)
  shlq   -0x50(%rbp)
L105:
  addq   $0x1,-0x38(%rbp)
L45:
  mov    -0x38(%rbp),%rax
  cmp    -0x28(%rbp),%rax
  jb     L93
  jmp    L86
L3:
  mov    -0x68(%rbp),%rdx
  mov    -0x40(%rbp),%rax
  lea    (%rdx,%rax,1),%rcx
  mov    -0x58(%rbp),%rax
  mov    $0x1,%edx
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <strncat@plt>
  addq   $0x1,-0x48(%rbp)
  mov    -0x50(%rbp),%rax
  add    %rax,%rax
  movabs $0xaaaaaaaaaaaaaaab,%rdx
  mul    %rdx
  mov    %rdx,%rax
  shr    %rax
  cmp    %rax,-0x48(%rbp)
  jbe    L86
  mov    -0x50(%rbp),%rax
  lea    (%rax,%rax,1),%rdx
  mov    -0x58(%rbp),%rax
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <realloc@plt>
  mov    %rax,-0x58(%rbp)
  shlq   -0x50(%rbp)
L86:
  movb   $0x0,-0x20(%rbp)
L18:
  addq   $0x1,-0x40(%rbp)
L62:
  mov    -0x40(%rbp),%rax
  cmp    -0x30(%rbp),%rax
  jb     L68
  mov    -0x58(%rbp),%rax
L67:
  mov    -0x8(%rbp),%rdx
  sub    %fs:0x28,%rdx
  je     L34
  call   <__stack_chk_fail@plt>
L34:
  leave
  ret
```

assistant: ```c
char *decode(const char *data) {
  size_t length = strlen(data);
  char *result = malloc(sizeof(char) * length * 2);
  size_t result_size = length * 2;
  size_t result_len = 0;
  result[0] = '\0';
  char temp[20];
  temp[0] = '\0';
  if (length == 0)
    return result;
  for (size_t i = 0; i < length; ++i) {
    if (isdigit(data[i])) {
      strncat(temp, &data[i], 1);
    } else {
      if (strlen(temp) > 0) {
        size_t number = atoi(temp);
        for (size_t j = 0; j < number; ++j) {
          strncat(result, &data[i], 1);
          result_len++;
          if (result_len > result_size * 2 / 3) {
            result = realloc(result, result_size * 2);
            result_size *= 2;
          }
        }
      } else {
        strncat(result, &data[i], 1);
        result_len++;
        if (result_len > result_size * 2 / 3) {
          result = realloc(result, result_size * 2);
          result_size *= 2;
        }
      }
      temp[0] = '\0';
    }
  }
  return result;
}
```