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

```asm
<uitoa>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  mov    %rdi,-0x28(%rbp)
  mov    %esi,-0x2c(%rbp)
  mov    -0x28(%rbp),%rax
  mov    %rax,-0x10(%rbp)
L60:
  mov    -0x2c(%rbp),%ecx
  mov    %ecx,%edx
  mov    $0xcccccccd,%eax
  imul   %rdx,%rax
  shr    $0x20,%rax
  mov    %eax,%edx
  shr    $0x3,%edx
  mov    %edx,%eax
  shl    $0x2,%eax
  add    %edx,%eax
  add    %eax,%eax
  sub    %eax,%ecx
  mov    %ecx,%edx
  mov    %edx,-0x14(%rbp)
  mov    -0x2c(%rbp),%eax
  mov    %eax,%edx
  mov    $0xcccccccd,%eax
  imul   %rdx,%rax
  shr    $0x20,%rax
  shr    $0x3,%eax
  mov    %eax,-0x2c(%rbp)
  cmpl   $0x9,-0x14(%rbp)
  ja     L67
  mov    -0x14(%rbp),%eax
  lea    0x0(,%rax,4),%rdx
  lea    D11(%rip),%rax
  mov    (%rdx,%rax,1),%eax
  cltq
  lea    D11(%rip),%rdx
  add    %rdx,%rax
  notrack jmp *%rax
  mov    -0x10(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x10(%rbp)
  movb   $0x30,(%rax)
  jmp    L67
  mov    -0x10(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x10(%rbp)
  movb   $0x31,(%rax)
  jmp    L67
  mov    -0x10(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x10(%rbp)
  movb   $0x32,(%rax)
  jmp    L67
  mov    -0x10(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x10(%rbp)
  movb   $0x33,(%rax)
  jmp    L67
  mov    -0x10(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x10(%rbp)
  movb   $0x34,(%rax)
  jmp    L67
  mov    -0x10(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x10(%rbp)
  movb   $0x35,(%rax)
  jmp    L67
  mov    -0x10(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x10(%rbp)
  movb   $0x36,(%rax)
  jmp    L67
  mov    -0x10(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x10(%rbp)
  movb   $0x37,(%rax)
  jmp    L67
  mov    -0x10(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x10(%rbp)
  movb   $0x38,(%rax)
  jmp    L67
  mov    -0x10(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x10(%rbp)
  movb   $0x39,(%rax)
  nop
L67:
  cmpl   $0x0,-0x2c(%rbp)
  jne    L60
  mov    -0x10(%rbp),%rax
  mov    %rax,-0x8(%rbp)
  mov    -0x10(%rbp),%rax
  lea    -0x1(%rax),%rdx
  mov    %rdx,-0x10(%rbp)
  movb   $0x0,(%rax)
  jmp    L66
L48:
  mov    -0x10(%rbp),%rax
  movzbl (%rax),%eax
  mov    %al,-0x15(%rbp)
  mov    -0x10(%rbp),%rax
  lea    -0x1(%rax),%rdx
  mov    %rdx,-0x10(%rbp)
  mov    -0x28(%rbp),%rdx
  movzbl (%rdx),%edx
  mov    %dl,(%rax)
  mov    -0x28(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x28(%rbp)
  movzbl -0x15(%rbp),%edx
  mov    %dl,(%rax)
L66:
  mov    -0x10(%rbp),%rax
  cmp    -0x28(%rbp),%rax
  ja     L48
  mov    -0x8(%rbp),%rax
  pop    %rbp
  ret
```

assistant: ```c
char *uitoa(char *buf, unsigned int i) {
  char *p = buf;
  do {
    int digit = i % 10;
    i /= 10;
    switch (digit) {
    case 0:
      *p++ = '0';
      break;
    case 1:
      *p++ = '1';
      break;
    case 2:
      *p++ = '2';
      break;
    case 3:
      *p++ = '3';
      break;
    case 4:
      *p++ = '4';
      break;
    case 5:
      *p++ = '5';
      break;
    case 6:
      *p++ = '6';
      break;
    case 7:
      *p++ = '7';
      break;
    case 8:
      *p++ = '8';
      break;
    case 9:
      *p++ = '9';
      break;
    }
  } while (i > 0);
  char *res = p;
  *p-- = '\0';
  while (p > buf) {
    char tmp = *p;
    *p-- = *buf;
    *buf++ = tmp;
  }
  return res;
}
```