user: Translate the below assembly code into C programming language:

```asm
<ui32tostr>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x30,%rsp
  mov    %rdi,-0x18(%rbp)
  mov    %rsi,-0x20(%rbp)
  mov    %edx,-0x24(%rbp)
  mov    %ecx,-0x28(%rbp)
  cmpl   $0x3b9aca00,-0x24(%rbp)
  seta   %al
  movzbl %al,%eax
  mov    $0x0,%esi
  mov    %eax,%edi
  call   <__builtin_expect@plt>
  test   %rax,%rax
  je     L55
  mov    $0x0,%eax
  jmp    L41
L55:
  mov    -0x28(%rbp),%eax
  cltq
  mov    %rax,-0x8(%rbp)
  mov    -0x8(%rbp),%rax
  cmp    -0x20(%rbp),%rax
  jae    L16
  mov    -0x8(%rbp),%rax
  jmp    L9
L16:
  mov    -0x20(%rbp),%rax
L9:
  cmp    $0x9,%rax
  ja     L11
  lea    0x0(,%rax,4),%rdx
  lea    D13(%rip),%rax
  mov    (%rdx,%rax,1),%eax
  cltq
  lea    D13(%rip),%rdx
  add    %rdx,%rax
  notrack jmp *%rax
  mov    -0x24(%rbp),%eax
  mov    %eax,%eax
  imul   $0x55e63b89,%rax,%rax
  shr    $0x20,%rax
  mov    %eax,%ecx
  shr    $0x19,%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,%eax
  xor    $0x30,%eax
  mov    %eax,%edx
  mov    -0x28(%rbp),%eax
  cltq
  lea    -0x9(%rax),%rcx
  mov    -0x18(%rbp),%rax
  add    %rcx,%rax
  mov    %dl,(%rax)
  mov    -0x24(%rbp),%eax
  mov    %eax,%eax
  imul   $0x6b5fca6b,%rax,%rax
  shr    $0x20,%rax
  mov    %eax,%ecx
  shr    $0x16,%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,%eax
  xor    $0x30,%eax
  mov    %eax,%edx
  mov    -0x28(%rbp),%eax
  cltq
  lea    -0x8(%rax),%rcx
  mov    -0x18(%rbp),%rax
  add    %rcx,%rax
  mov    %dl,(%rax)
  mov    -0x24(%rbp),%eax
  mov    %eax,%eax
  imul   $0x431bde83,%rax,%rax
  shr    $0x20,%rax
  mov    %eax,%ecx
  shr    $0x12,%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,%eax
  xor    $0x30,%eax
  mov    %eax,%edx
  mov    -0x28(%rbp),%eax
  cltq
  lea    -0x7(%rax),%rcx
  mov    -0x18(%rbp),%rax
  add    %rcx,%rax
  mov    %dl,(%rax)
  mov    -0x24(%rbp),%eax
  shr    $0x5,%eax
  mov    %eax,%eax
  imul   $0xa7c5ac5,%rax,%rax
  shr    $0x20,%rax
  mov    %eax,%ecx
  shr    $0x7,%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,%eax
  xor    $0x30,%eax
  mov    %eax,%edx
  mov    -0x28(%rbp),%eax
  cltq
  lea    -0x6(%rax),%rcx
  mov    -0x18(%rbp),%rax
  add    %rcx,%rax
  mov    %dl,(%rax)
  mov    -0x24(%rbp),%eax
  mov    %eax,%edx
  mov    $0xd1b71759,%eax
  imul   %rdx,%rax
  shr    $0x20,%rax
  mov    %eax,%ecx
  shr    $0xd,%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,%eax
  xor    $0x30,%eax
  mov    %eax,%edx
  mov    -0x28(%rbp),%eax
  cltq
  lea    -0x5(%rax),%rcx
  mov    -0x18(%rbp),%rax
  add    %rcx,%rax
  mov    %dl,(%rax)
  mov    -0x24(%rbp),%eax
  mov    %eax,%eax
  imul   $0x10624dd3,%rax,%rax
  shr    $0x20,%rax
  mov    %eax,%ecx
  shr    $0x6,%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,%eax
  xor    $0x30,%eax
  mov    %eax,%edx
  mov    -0x28(%rbp),%eax
  cltq
  lea    -0x4(%rax),%rcx
  mov    -0x18(%rbp),%rax
  add    %rcx,%rax
  mov    %dl,(%rax)
  mov    -0x24(%rbp),%eax
  mov    %eax,%eax
  imul   $0x51eb851f,%rax,%rax
  shr    $0x20,%rax
  mov    %eax,%ecx
  shr    $0x5,%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,%eax
  xor    $0x30,%eax
  mov    %eax,%edx
  mov    -0x28(%rbp),%eax
  cltq
  lea    -0x3(%rax),%rcx
  mov    -0x18(%rbp),%rax
  add    %rcx,%rax
  mov    %dl,(%rax)
  mov    -0x24(%rbp),%eax
  mov    %eax,%edx
  mov    $0xcccccccd,%eax
  imul   %rdx,%rax
  shr    $0x20,%rax
  mov    %eax,%ecx
  shr    $0x3,%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,%eax
  xor    $0x30,%eax
  mov    %eax,%edx
  mov    -0x28(%rbp),%eax
  cltq
  lea    -0x2(%rax),%rcx
  mov    -0x18(%rbp),%rax
  add    %rcx,%rax
  mov    %dl,(%rax)
  mov    -0x24(%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,%eax
  xor    $0x30,%eax
  mov    %eax,%edx
  mov    -0x28(%rbp),%eax
  cltq
  lea    -0x1(%rax),%rcx
  mov    -0x18(%rbp),%rax
  add    %rcx,%rax
  mov    %dl,(%rax)
  jmp    L7
L11:
  movq   $0x0,-0x8(%rbp)
  nop
L7:
  mov    -0x8(%rbp),%rax
L41:
  leave
  ret
```

assistant: ```c
size_t ui32tostr(char *restrict buf, size_t bsz, uint32_t d, int width) {
  size_t res;
  if (__builtin_expect((d > 1000000000U), 0)) {
    return 0U;
  }
  switch ((res = (size_t)width) < bsz ? res : bsz) {
  case 9:
    buf[width - 9] = (char)(((d) / (100000000) % 10) ^ '0');
    buf[width - 8] = (char)(((d) / (10000000) % 10) ^ '0');
    buf[width - 7] = (char)(((d) / (1000000) % 10) ^ '0');
  case 6:
    buf[width - 6] = (char)(((d) / (100000) % 10) ^ '0');
    buf[width - 5] = (char)(((d) / (10000) % 10) ^ '0');
  case 4:
    buf[width - 4] = (char)(((d) / (1000) % 10) ^ '0');
  case 3:
    buf[width - 3] = (char)(((d) / (100) % 10) ^ '0');
  case 2:
    buf[width - 2] = (char)(((d) / (10) % 10) ^ '0');
  case 1:
    buf[width - 1] = (char)(((d) / (1) % 10) ^ '0');
    break;
  default:
  case 0:
    res = 0U;
    break;
  }
  return res;
}
```