user: 请将这段汇编代码片段转换成等效的C代码：

```asm
<number>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x90,%rsp
  mov    %rdi,-0x78(%rbp)
  mov    %rsi,-0x80(%rbp)
  mov    %edx,-0x84(%rbp)
  mov    %ecx,-0x88(%rbp)
  mov    %r8d,-0x8c(%rbp)
  mov    %r9d,-0x90(%rbp)
  mov    %fs:0x28,%rax
  mov    %rax,-0x8(%rbp)
  xor    %eax,%eax
  lea    D8(%rip),%rax
  mov    %rax,-0x58(%rbp)
  mov    -0x90(%rbp),%eax
  and    $0x40,%eax
  test   %eax,%eax
  je     L254
  lea    D4(%rip),%rax
  mov    %rax,-0x58(%rbp)
L254:
  mov    -0x90(%rbp),%eax
  and    $0x10,%eax
  test   %eax,%eax
  je     L344
  andl   $0xfffffffe,-0x90(%rbp)
L344:
  cmpl   $0x1,-0x84(%rbp)
  jle    L204
  cmpl   $0x24,-0x84(%rbp)
  jle    L313
L204:
  mov    $0x0,%eax
  jmp    L385
L313:
  mov    -0x90(%rbp),%eax
  and    $0x1,%eax
  test   %eax,%eax
  je     L190
  mov    $0x30,%eax
  jmp    L377
L190:
  mov    $0x20,%eax
L377:
  mov    %al,-0x65(%rbp)
  movb   $0x0,-0x66(%rbp)
  mov    -0x90(%rbp),%eax
  and    $0x2,%eax
  test   %eax,%eax
  je     L33
  mov    -0x80(%rbp),%rax
  test   %rax,%rax
  jns    L143
  movb   $0x2d,-0x66(%rbp)
  mov    -0x80(%rbp),%rax
  neg    %rax
  mov    %rax,-0x80(%rbp)
  subl   $0x1,-0x88(%rbp)
  jmp    L33
L143:
  mov    -0x90(%rbp),%eax
  and    $0x4,%eax
  test   %eax,%eax
  je     L342
  movb   $0x2b,-0x66(%rbp)
  subl   $0x1,-0x88(%rbp)
  jmp    L33
L342:
  mov    -0x90(%rbp),%eax
  and    $0x8,%eax
  test   %eax,%eax
  je     L33
  movb   $0x20,-0x66(%rbp)
  subl   $0x1,-0x88(%rbp)
L33:
  mov    -0x90(%rbp),%eax
  and    $0x20,%eax
  test   %eax,%eax
  je     L365
  cmpl   $0x10,-0x84(%rbp)
  jne    L116
  subl   $0x2,-0x88(%rbp)
  jmp    L365
L116:
  cmpl   $0x8,-0x84(%rbp)
  jne    L365
  subl   $0x1,-0x88(%rbp)
L365:
  movl   $0x0,-0x64(%rbp)
  mov    -0x80(%rbp),%rax
  test   %rax,%rax
  jne    L202
  mov    -0x64(%rbp),%eax
  lea    0x1(%rax),%edx
  mov    %edx,-0x64(%rbp)
  cltq
  movb   $0x30,-0x50(%rbp,%rax,1)
  jmp    L269
L132:
  mov    -0x84(%rbp),%eax
  mov    %eax,-0x5c(%rbp)
  mov    -0x80(%rbp),%rax
  shr    $0x20,%rax
  test   %rax,%rax
  jne    L242
  mov    -0x80(%rbp),%rax
  mov    $0x0,%edx
  divl   -0x5c(%rbp)
  mov    %edx,-0x60(%rbp)
  mov    -0x80(%rbp),%rax
  mov    $0x0,%edx
  divl   -0x5c(%rbp)
  mov    %eax,%eax
  mov    %rax,-0x80(%rbp)
  jmp    L171
L242:
  mov    -0x5c(%rbp),%edx
  lea    -0x80(%rbp),%rax
  mov    %edx,%esi
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <__div64_32@plt>
  mov    %eax,-0x60(%rbp)
L171:
  mov    -0x60(%rbp),%eax
  mov    %eax,%edx
  mov    -0x58(%rbp),%rax
  lea    (%rdx,%rax,1),%rcx
  mov    -0x64(%rbp),%eax
  lea    0x1(%rax),%edx
  mov    %edx,-0x64(%rbp)
  movzbl (%rcx),%edx
  cltq
  mov    %dl,-0x50(%rbp,%rax,1)
L202:
  mov    -0x80(%rbp),%rax
  test   %rax,%rax
  jne    L132
L269:
  mov    -0x64(%rbp),%eax
  cmp    -0x8c(%rbp),%eax
  jle    L293
  mov    -0x64(%rbp),%eax
  mov    %eax,-0x8c(%rbp)
L293:
  mov    -0x8c(%rbp),%eax
  sub    %eax,-0x88(%rbp)
  mov    -0x90(%rbp),%eax
  and    $0x11,%eax
  test   %eax,%eax
  jne    L86
  jmp    L105
L193:
  mov    -0x78(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x78(%rbp)
  movb   $0x20,(%rax)
L105:
  mov    -0x88(%rbp),%eax
  lea    -0x1(%rax),%edx
  mov    %edx,-0x88(%rbp)
  test   %eax,%eax
  jg     L193
L86:
  cmpb   $0x0,-0x66(%rbp)
  je     L72
  mov    -0x78(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x78(%rbp)
  movzbl -0x66(%rbp),%edx
  mov    %dl,(%rax)
L72:
  mov    -0x90(%rbp),%eax
  and    $0x20,%eax
  test   %eax,%eax
  je     L288
  cmpl   $0x8,-0x84(%rbp)
  jne    L292
  mov    -0x78(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x78(%rbp)
  movb   $0x30,(%rax)
  jmp    L288
L292:
  cmpl   $0x10,-0x84(%rbp)
  jne    L288
  mov    -0x78(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x78(%rbp)
  movb   $0x30,(%rax)
  mov    -0x58(%rbp),%rax
  lea    0x21(%rax),%rcx
  mov    -0x78(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x78(%rbp)
  movzbl (%rcx),%edx
  mov    %dl,(%rax)
L288:
  mov    -0x90(%rbp),%eax
  and    $0x10,%eax
  test   %eax,%eax
  jne    L87
  jmp    L81
L149:
  mov    -0x78(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x78(%rbp)
  movzbl -0x65(%rbp),%edx
  mov    %dl,(%rax)
L81:
  mov    -0x88(%rbp),%eax
  lea    -0x1(%rax),%edx
  mov    %edx,-0x88(%rbp)
  test   %eax,%eax
  jg     L149
  jmp    L87
L138:
  mov    -0x78(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x78(%rbp)
  movb   $0x30,(%rax)
L87:
  mov    -0x8c(%rbp),%eax
  lea    -0x1(%rax),%edx
  mov    %edx,-0x8c(%rbp)
  cmp    %eax,-0x64(%rbp)
  jl     L138
  jmp    L376
L214:
  mov    -0x78(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x78(%rbp)
  mov    -0x64(%rbp),%edx
  movslq %edx,%rdx
  movzbl -0x50(%rbp,%rdx,1),%edx
  mov    %dl,(%rax)
L376:
  mov    -0x64(%rbp),%eax
  lea    -0x1(%rax),%edx
  mov    %edx,-0x64(%rbp)
  test   %eax,%eax
  jg     L214
  jmp    L247
L113:
  mov    -0x78(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x78(%rbp)
  movb   $0x20,(%rax)
L247:
  mov    -0x88(%rbp),%eax
  lea    -0x1(%rax),%edx
  mov    %edx,-0x88(%rbp)
  test   %eax,%eax
  jg     L113
  mov    -0x78(%rbp),%rax
L385:
  mov    -0x8(%rbp),%rdx
  sub    %fs:0x28,%rdx
  je     L3
  call   <__stack_chk_fail@plt>
L3:
  leave
  ret
```

tool_calls: name: read_data
arguments: tag: D8
datatype: string
name: read_data
arguments: tag: D4
datatype: string

tool: D8: 0123456789abcdefghijklmnopqrstuvwxyz

tool: D4: 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ

assistant: ```c
char *number(char *str, unsigned long long num, int base, int size, int precision, int type) {
  char c, sign, tmp[66];
  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' : ' ';
  sign = 0;
  if (type & 2) {
    if ((signed long long)num < 0) {
      sign = '-';
      num = -(signed long long)num;
      size--;
    } else if (type & 4) {
      sign = '+';
      size--;
    } else if (type & 8) {
      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[({
        unsigned int __base = (base);
        unsigned int __rem;
        (void)(((typeof((num)) *)0) == ((unsigned long long *)0));
        if (((num) >> 32) == 0) {
          __rem = (unsigned int)(num) % __base;
          (num) = (unsigned int)(num) / __base;
        } else
          __rem = __div64_32(&(num), __base);
        __rem;
      })];
    }
  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;
}
```