user: 请显示与下面列出的汇编代码相匹配的C语言实现:

```asm
<number>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x70,%rsp
  mov    %rdi,-0x58(%rbp)
  mov    %esi,-0x5c(%rbp)
  mov    %edx,-0x60(%rbp)
  mov    %ecx,-0x64(%rbp)
  mov    %r8d,-0x68(%rbp)
  mov    %r9d,-0x6c(%rbp)
  mov    %fs:0x28,%rax
  mov    %rax,-0x8(%rbp)
  xor    %eax,%eax
  lea    D11(%rip),%rax
  mov    %rax,-0x38(%rbp)
  mov    -0x6c(%rbp),%eax
  and    $0x40,%eax
  test   %eax,%eax
  je     L52
  lea    D14(%rip),%rax
  mov    %rax,-0x38(%rbp)
L52:
  mov    -0x6c(%rbp),%eax
  and    $0x10,%eax
  test   %eax,%eax
  je     L358
  andl   $0xfffffffe,-0x6c(%rbp)
L358:
  cmpl   $0x1,-0x60(%rbp)
  jle    L51
  cmpl   $0x24,-0x60(%rbp)
  jle    L215
L51:
  mov    $0x0,%eax
  jmp    L91
L215:
  mov    -0x6c(%rbp),%eax
  and    $0x1,%eax
  test   %eax,%eax
  je     L38
  mov    $0x30,%eax
  jmp    L368
L38:
  mov    $0x20,%eax
L368:
  mov    %al,-0x41(%rbp)
  mov    -0x6c(%rbp),%eax
  and    $0x2,%eax
  test   %eax,%eax
  je     L201
  cmpl   $0x0,-0x5c(%rbp)
  jns    L201
  movb   $0x2d,-0x42(%rbp)
  negl   -0x5c(%rbp)
  jmp    L278
L201:
  mov    -0x6c(%rbp),%eax
  and    $0x4,%eax
  test   %eax,%eax
  jne    L324
  mov    -0x6c(%rbp),%eax
  shl    $0x2,%eax
  and    $0x20,%eax
  jmp    L307
L324:
  mov    $0x2b,%eax
L307:
  mov    %al,-0x42(%rbp)
L278:
  cmpb   $0x0,-0x42(%rbp)
  je     L251
  subl   $0x1,-0x64(%rbp)
L251:
  mov    -0x6c(%rbp),%eax
  and    $0x20,%eax
  test   %eax,%eax
  je     L14
  cmpl   $0x10,-0x60(%rbp)
  jne    L294
  subl   $0x2,-0x64(%rbp)
  jmp    L14
L294:
  cmpl   $0x8,-0x60(%rbp)
  jne    L14
  subl   $0x1,-0x64(%rbp)
L14:
  movl   $0x0,-0x40(%rbp)
  cmpl   $0x0,-0x5c(%rbp)
  jne    L125
  mov    -0x40(%rbp),%eax
  lea    0x1(%rax),%edx
  mov    %edx,-0x40(%rbp)
  cltq
  movb   $0x30,-0x30(%rbp,%rax,1)
  jmp    L159
L69:
  mov    $0x0,%edx
  mov    -0x60(%rbp),%eax
  div    %eax
  mov    %eax,-0x5c(%rbp)
  mov    %edx,-0x3c(%rbp)
  mov    -0x3c(%rbp),%eax
  movslq %eax,%rdx
  mov    -0x38(%rbp),%rax
  lea    (%rdx,%rax,1),%rcx
  mov    -0x40(%rbp),%eax
  lea    0x1(%rax),%edx
  mov    %edx,-0x40(%rbp)
  movzbl (%rcx),%edx
  cltq
  mov    %dl,-0x30(%rbp,%rax,1)
L125:
  cmpl   $0x0,-0x5c(%rbp)
  jne    L69
L159:
  mov    -0x40(%rbp),%eax
  cmp    -0x68(%rbp),%eax
  jle    L173
  mov    -0x40(%rbp),%eax
  mov    %eax,-0x68(%rbp)
L173:
  mov    -0x68(%rbp),%eax
  sub    %eax,-0x64(%rbp)
  mov    -0x6c(%rbp),%eax
  and    $0x11,%eax
  test   %eax,%eax
  jne    L369
  jmp    L176
L140:
  mov    -0x58(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x58(%rbp)
  movb   $0x20,(%rax)
L176:
  mov    -0x64(%rbp),%eax
  lea    -0x1(%rax),%edx
  mov    %edx,-0x64(%rbp)
  test   %eax,%eax
  jg     L140
L369:
  cmpb   $0x0,-0x42(%rbp)
  je     L21
  mov    -0x58(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x58(%rbp)
  movzbl -0x42(%rbp),%edx
  mov    %dl,(%rax)
L21:
  mov    -0x6c(%rbp),%eax
  and    $0x20,%eax
  test   %eax,%eax
  je     L165
  cmpl   $0x8,-0x60(%rbp)
  jne    L188
  mov    -0x58(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x58(%rbp)
  movb   $0x30,(%rax)
  jmp    L165
L188:
  cmpl   $0x10,-0x60(%rbp)
  jne    L165
  mov    -0x58(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x58(%rbp)
  movb   $0x30,(%rax)
  mov    -0x38(%rbp),%rax
  lea    0x21(%rax),%rcx
  mov    -0x58(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x58(%rbp)
  movzbl (%rcx),%edx
  mov    %dl,(%rax)
L165:
  mov    -0x6c(%rbp),%eax
  and    $0x10,%eax
  test   %eax,%eax
  jne    L121
  jmp    L101
L268:
  mov    -0x58(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x58(%rbp)
  movzbl -0x41(%rbp),%edx
  mov    %dl,(%rax)
L101:
  mov    -0x64(%rbp),%eax
  lea    -0x1(%rax),%edx
  mov    %edx,-0x64(%rbp)
  test   %eax,%eax
  jg     L268
  jmp    L121
L315:
  mov    -0x58(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x58(%rbp)
  movb   $0x30,(%rax)
L121:
  mov    -0x68(%rbp),%eax
  lea    -0x1(%rax),%edx
  mov    %edx,-0x68(%rbp)
  cmp    %eax,-0x40(%rbp)
  jl     L315
  jmp    L115
L353:
  mov    -0x58(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x58(%rbp)
  mov    -0x40(%rbp),%edx
  movslq %edx,%rdx
  movzbl -0x30(%rbp,%rdx,1),%edx
  mov    %dl,(%rax)
L115:
  mov    -0x40(%rbp),%eax
  lea    -0x1(%rax),%edx
  mov    %edx,-0x40(%rbp)
  test   %eax,%eax
  jg     L353
  jmp    L185
L258:
  mov    -0x58(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x58(%rbp)
  movb   $0x20,(%rax)
L185:
  mov    -0x64(%rbp),%eax
  lea    -0x1(%rax),%edx
  mov    %edx,-0x64(%rbp)
  test   %eax,%eax
  jg     L258
  mov    -0x58(%rbp),%rax
L91:
  mov    -0x8(%rbp),%rdx
  sub    %fs:0x28,%rdx
  je     L100
  call   <__stack_chk_fail@plt>
L100:
  leave
  ret
```

tool_calls: name: unpack_data
arguments: data_label: D11
data_type: string
name: unpack_data
arguments: data_label: D14
data_type: string

tool: D11: 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ

tool: D14: 0123456789abcdefghijklmnopqrstuvwxyz

assistant: ```c
char *number(char *str, int num, int base, int size, int precision, int type) {
  char c, sign, tmp[36];
  const char *digits = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
  int i;
  if (type & 64)
    digits = "0123456789abcdefghijklmnopqrstuvwxyz";
  if (type & 16)
    type &= ~1;
  if (base < 2 || base > 36)
    return 0;
  c = (type & 1) ? '0' : ' ';
  if (type & 2 && num < 0) {
    sign = '-';
    num = -num;
  } else
    sign = (type & 4) ? '+' : ((type & 8) ? ' ' : 0);
  if (sign)
    size--;
  if (type & 32)
    if (base == 16)
      size -= 2;
    else if (base == 8)
      size--;
  i = 0;
  if (num == 0)
    tmp[i++] = '0';
  else
    while (num != 0)
      tmp[i++] = digits[({
        int __res;
        __asm__("divl %4" : "=a"(num), "=d"(__res) : ""(num), "1"(0), "r"(base));
        __res;
      })];
  if (i > precision)
    precision = i;
  size -= precision;
  if (!(type & (1 + 16)))
    while (size-- > 0)
      *str++ = ' ';
  if (sign)
    *str++ = sign;
  if (type & 32)
    if (base == 8)
      *str++ = '0';
    else if (base == 16) {
      *str++ = '0';
      *str++ = digits[33];
    }
  if (!(type & 16))
    while (size-- > 0)
      *str++ = c;
  while (i < precision--)
    *str++ = '0';
  while (i-- > 0)
    *str++ = tmp[i];
  while (size-- > 0)
    *str++ = ' ';
  return str;
}
```