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

```asm
<ft_putnbr>:
  endbr64
  push   %r15
  mov    %edi,%eax
  push   %r14
  push   %r13
  mov    $0xcccccccd,%r13d
  push   %r12
  push   %rbp
  mov    %eax,%ebp
  push   %rbx
  sub    $0x38,%rsp
  test   %eax,%eax
  js     L101
L69:
  cmp    $0x9,%ebp
  jbe    L113
L85:
  mov    %ebp,%r12d
  mov    %r12,%rax
  imul   %r13,%rax
  shr    $0x23,%rax
  mov    %rax,0x10(%rsp)
  cmp    $0x63,%ebp
  jbe    L118
  imul   $0x51eb851f,%r12,%rax
  shr    $0x25,%rax
  mov    %rax,0x18(%rsp)
  cmp    $0x3e7,%ebp
  jbe    L88
  imul   $0x10624dd3,%r12,%rax
  shr    $0x26,%rax
  mov    %rax,0x20(%rsp)
  cmp    $0x270f,%ebp
  jbe    L94
  mov    $0xd1b71759,%r14d
  imul   %r12,%r14
  shr    $0x2d,%r14
  cmp    $0x1869f,%ebp
  jbe    L119
  mov    %ebp,%ebx
  shr    $0x5,%ebx
  imul   $0xa7c5ac5,%rbx,%rbx
  shr    $0x27,%rbx
  cmp    $0xf423f,%ebp
  jbe    L65
  imul   $0x431bde83,%r12,%r15
  shr    $0x32,%r15
  mov    %r15,0x8(%rsp)
  cmp    $0x98967f,%ebp
  jbe    L6
  imul   $0x6b5fca6b,%r12,%rdx
  shr    $0x36,%rdx
  mov    %rdx,%r15
  cmp    $0x5f5e0ff,%ebp
  jbe    L66
  imul   $0x55e63b89,%r12,%rax
  shr    $0x39,%rax
  cmp    $0x3b9ac9ff,%ebp
  jbe    L58
  mov    %ebp,%edi
  mov    %eax,0x2c(%rsp)
  shr    $0x9,%edi
  imul   $0x44b83,%rdi,%rdi
  shr    $0x27,%rdi
  call   <ft_putnbr>
  mov    0x2c(%rsp),%ecx
  mov    %rcx,%rax
  imul   %r13,%rcx
  shr    $0x23,%rcx
  lea    (%rcx,%rcx,4),%ecx
  add    %ecx,%ecx
  sub    %ecx,%eax
L58:
  lea    0x30(%rax),%edi
  call   <ft_putchar@plt>
  mov    %r15d,%eax
  imul   %r13,%rax
  shr    $0x23,%rax
  lea    (%rax,%rax,4),%eax
  add    %eax,%eax
  sub    %eax,%r15d
L66:
  lea    0x30(%r15),%edi
  call   <ft_putchar@plt>
  mov    0x8(%rsp),%eax
  mov    %rax,%rsi
  imul   %r13,%rax
  shr    $0x23,%rax
  lea    (%rax,%rax,4),%eax
  add    %eax,%eax
  sub    %eax,%esi
  mov    %esi,0x8(%rsp)
L6:
  mov    0x8(%rsp),%edi
  add    $0x30,%edi
  call   <ft_putchar@plt>
  mov    %ebx,%eax
  imul   %r13,%rax
  shr    $0x23,%rax
  lea    (%rax,%rax,4),%eax
  add    %eax,%eax
  sub    %eax,%ebx
L65:
  lea    0x30(%rbx),%edi
  call   <ft_putchar@plt>
  mov    %r14d,%eax
  imul   %r13,%rax
  shr    $0x23,%rax
  lea    (%rax,%rax,4),%eax
  add    %eax,%eax
  sub    %eax,%r14d
L119:
  lea    0x30(%r14),%edi
  call   <ft_putchar@plt>
  mov    0x20(%rsp),%eax
  mov    %rax,%rdx
  imul   %r13,%rax
  shr    $0x23,%rax
  lea    (%rax,%rax,4),%eax
  add    %eax,%eax
  sub    %eax,%edx
  mov    %edx,0x20(%rsp)
L94:
  mov    0x20(%rsp),%edi
  add    $0x30,%edi
  call   <ft_putchar@plt>
  mov    0x18(%rsp),%eax
  mov    %rax,%rsi
  imul   %r13,%rax
  shr    $0x23,%rax
  lea    (%rax,%rax,4),%eax
  add    %eax,%eax
  sub    %eax,%esi
  mov    %esi,0x18(%rsp)
L88:
  mov    0x18(%rsp),%edi
  add    $0x30,%edi
  call   <ft_putchar@plt>
  mov    0x10(%rsp),%eax
  mov    %rax,%rcx
  imul   %r13,%rax
  shr    $0x23,%rax
  lea    (%rax,%rax,4),%eax
  add    %eax,%eax
  sub    %eax,%ecx
  mov    %ecx,0x10(%rsp)
L118:
  mov    0x10(%rsp),%edi
  add    $0x30,%edi
  call   <ft_putchar@plt>
  mov    %r12,%rax
  imul   %r13,%rax
  shr    $0x23,%rax
  lea    (%rax,%rax,4),%edx
  mov    %ebp,%eax
  add    %edx,%edx
  sub    %edx,%eax
  mov    %eax,%ebp
  test   %eax,%eax
  jns    L69
L101:
  mov    $0x2d,%edi
  neg    %ebp
  call   <ft_putchar@plt>
  cmp    $0x9,%ebp
  ja     L85
L113:
  add    $0x38,%rsp
  lea    0x30(%rbp),%edi
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  jmp    1050 <ft_putchar@plt>
```

assistant: ```c
void ft_putnbr(int n) {
  unsigned int nbr;
  if (n < 0) {
    ft_putchar('-');
    nbr = -n;
  } else
    nbr = n;
  if (nbr >= 10) {
    ft_putnbr(nbr / 10);
    ft_putnbr(nbr % 10);
  } else {
    ft_putchar(nbr + '0');
  }
}
```