user: 请将以下的汇编代码转换成C语言代码:

```asm
<NumberIO_IntToStr>:
  endbr64
  push   %r15
  push   %r14
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  sub    $0x78,%rsp
  mov    %esi,0x8(%rsp)
  mov    %rdx,%r14
  mov    %ecx,%r13d
  mov    %fs:0x28,%rax
  mov    %rax,0x68(%rsp)
  xor    %eax,%eax
  mov    %edi,%eax
  movl   $0x0,0xc(%rsp)
  test   %edi,%edi
  js     L126
L71:
  lea    0x10(%rsp),%r12
  mov    $0x1,%ebp
  mov    $0xcccccccd,%r15d
  jmp    L84
L126:
  add    $0x1,%edi
  call   <abs@plt>
  add    $0x1,%eax
  movl   $0x1,0xc(%rsp)
  mov    0x8(%rsp),%esi
  test   %esi,%esi
  je     L71
  sub    $0x1,%esi
  mov    %esi,0x8(%rsp)
  jmp    L71
L99:
  add    $0x1,%ebp
  cmp    $0x14,%ebp
  ja     L70
L25:
  add    $0x4,%r12
  mov    %ebx,%eax
L84:
  mov    %eax,%ebx
  imul   %r15,%rbx
  shr    $0x23,%rbx
  lea    (%rbx,%rbx,4),%edx
  add    %edx,%edx
  mov    %eax,%ecx
  sub    %edx,%ecx
  mov    %ecx,(%r12)
  cmp    $0x9,%eax
  ja     L99
  cmp    %ebp,0x8(%rsp)
  jbe    L46
  mov    $0x0,%eax
L22:
  mov    %eax,%edx
  movb   $0x20,(%r14,%rdx,1)
  add    $0x1,%eax
  mov    0x8(%rsp),%edx
  sub    %eax,%edx
  cmp    %edx,%ebp
  jae    L176
  cmp    %eax,%r13d
  jae    L22
L176:
  cmpl   $0x0,0xc(%rsp)
  je     L128
  mov    %eax,%edx
  movb   $0x2d,(%r14,%rdx,1)
  add    $0x1,%eax
L128:
  test   %ebp,%ebp
  je     L165
  cmp    %eax,%r13d
  jb     L165
L120:
  sub    $0x1,%ebp
  mov    %eax,%ecx
  mov    %ebp,%edx
  mov    0x10(%rsp,%rdx,4),%edx
  add    $0x30,%edx
  mov    %dl,(%r14,%rcx,1)
  add    $0x1,%eax
  test   %ebp,%ebp
  je     L165
  cmp    %eax,%r13d
  jae    L120
L165:
  cmp    %eax,%r13d
  jb     L33
  mov    %eax,%eax
  movb   $0x0,(%r14,%rax,1)
L33:
  mov    0x68(%rsp),%rax
  sub    %fs:0x28,%rax
  jne    L141
  add    $0x78,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
L70:
  mov    $0x1d,%esi
  lea    D3(%rip),%rdi
  call   <StrIO_WriteString@plt>
  mov    $0x0,%eax
  call   <StrIO_WriteLn@plt>
  mov    $0xffffffff,%edi
  call   <M2RTS_HALT@plt>
  mov    $0x0,%eax
  call   <__builtin_unreachable@plt>
  jmp    L25
L46:
  mov    $0x0,%eax
  jmp    L176
L141:
  call   <__stack_chk_fail@plt>
```

tool_calls: name: disassemble_data
arguments: label: D3
type_guessed: string

tool: D3: NumberIO - increase MaxDigits

assistant: ```c
void NumberIO_IntToStr(int x, unsigned int n, char *a, unsigned int _a_high) {
  typedef struct _T9_a _T9;
  struct _T9_a {
    unsigned int array[20 - 1 + 1];
  };
  unsigned int i;
  unsigned int j;
  unsigned int c;
  unsigned int Higha;
  _T9 buf;
  unsigned int Negative;
  if (x < 0) {
    Negative = (1 == 1);
    c = ((unsigned int)(abs(x + 1))) + 1;
    if (n > 0) {
      n -= 1;
    }
  } else {
    c = x;
    Negative = (1 == 0);
  }
  i = 0;
  do {
    i += 1;
    if (i > 20) {
      StrIO_WriteString((char *)"NumberIO - increase MaxDigits", 29);
      StrIO_WriteLn();
      M2RTS_HALT(-1);
      __builtin_unreachable();
    }
    buf.array[i - 1] = c % 10;
    c = c / 10;
  } while (!(c == 0));
  j = 0;
  Higha = _a_high;
  while ((n > i) && (j <= Higha)) {
    a[j] = ' ';
    j += 1;
    n -= 1;
  }
  if (Negative) {
    a[j] = '-';
    j += 1;
  }
  while ((i != 0) && (j <= Higha)) {
    a[j] = ((char)(buf.array[i - 1] + ((unsigned int)('0'))));
    j += 1;
    i -= 1;
  }
  if (j <= Higha) {
    a[j] = (char)000;
  }
}
```