user: Converte this assembly snippet into its equivalent C code:

```asm
<put_dec_full>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  mov    %rdi,-0x18(%rbp)
  mov    %esi,-0x1c(%rbp)
  mov    -0x1c(%rbp),%eax
  shr    $0x4,%eax
  and    $0xf,%eax
  mov    %eax,-0x10(%rbp)
  mov    -0x1c(%rbp),%eax
  shr    $0x8,%eax
  and    $0xf,%eax
  mov    %eax,-0xc(%rbp)
  mov    -0x1c(%rbp),%eax
  shr    $0xc,%eax
  mov    %eax,-0x8(%rbp)
  mov    -0x8(%rbp),%edx
  mov    -0xc(%rbp),%eax
  add    %eax,%edx
  mov    -0x10(%rbp),%eax
  add    %eax,%edx
  mov    %edx,%eax
  add    %eax,%eax
  add    %edx,%eax
  add    %eax,%eax
  mov    %eax,%edx
  mov    -0x1c(%rbp),%eax
  and    $0xf,%eax
  add    %edx,%eax
  mov    %eax,-0x4(%rbp)
  mov    -0x4(%rbp),%eax
  imul   $0xcd,%eax,%eax
  shr    $0xb,%eax
  mov    %eax,-0x1c(%rbp)
  mov    -0x1c(%rbp),%edx
  mov    %edx,%eax
  shl    $0x2,%eax
  add    %edx,%eax
  add    %eax,%eax
  sub    %eax,-0x4(%rbp)
  mov    -0x4(%rbp),%eax
  lea    0x30(%rax),%ecx
  mov    -0x18(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x18(%rbp)
  mov    %ecx,%edx
  mov    %dl,(%rax)
  mov    -0x8(%rbp),%edx
  mov    %edx,%eax
  shl    $0x3,%eax
  lea    (%rax,%rdx,1),%ecx
  mov    -0xc(%rbp),%edx
  mov    %edx,%eax
  shl    $0x2,%eax
  add    %edx,%eax
  lea    (%rcx,%rax,1),%edx
  mov    -0x1c(%rbp),%eax
  add    %edx,%eax
  add    %eax,-0x10(%rbp)
  mov    -0x10(%rbp),%eax
  imul   $0xcd,%eax,%eax
  shr    $0xb,%eax
  mov    %eax,-0x1c(%rbp)
  mov    -0x1c(%rbp),%edx
  mov    %edx,%eax
  shl    $0x2,%eax
  add    %edx,%eax
  add    %eax,%eax
  sub    %eax,-0x10(%rbp)
  mov    -0x10(%rbp),%eax
  lea    0x30(%rax),%ecx
  mov    -0x18(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x18(%rbp)
  mov    %ecx,%edx
  mov    %dl,(%rax)
  mov    -0xc(%rbp),%eax
  lea    (%rax,%rax,1),%edx
  mov    -0x1c(%rbp),%eax
  add    %edx,%eax
  mov    %eax,-0xc(%rbp)
  mov    -0xc(%rbp),%edx
  mov    %edx,%eax
  add    %eax,%eax
  add    %edx,%eax
  shl    $0x2,%eax
  add    %edx,%eax
  shr    $0x7,%eax
  mov    %eax,-0x1c(%rbp)
  mov    -0x1c(%rbp),%edx
  mov    %edx,%eax
  shl    $0x2,%eax
  add    %edx,%eax
  add    %eax,%eax
  sub    %eax,-0xc(%rbp)
  mov    -0xc(%rbp),%eax
  lea    0x30(%rax),%ecx
  mov    -0x18(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x18(%rbp)
  mov    %ecx,%edx
  mov    %dl,(%rax)
  mov    -0x8(%rbp),%eax
  lea    0x0(,%rax,4),%edx
  mov    -0x1c(%rbp),%eax
  add    %edx,%eax
  mov    %eax,-0x8(%rbp)
  mov    -0x8(%rbp),%eax
  imul   $0xcd,%eax,%eax
  shr    $0xb,%eax
  mov    %eax,-0x1c(%rbp)
  mov    -0x1c(%rbp),%edx
  mov    %edx,%eax
  shl    $0x2,%eax
  add    %edx,%eax
  add    %eax,%eax
  sub    %eax,-0x8(%rbp)
  mov    -0x8(%rbp),%eax
  lea    0x30(%rax),%ecx
  mov    -0x18(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x18(%rbp)
  mov    %ecx,%edx
  mov    %dl,(%rax)
  mov    -0x1c(%rbp),%eax
  lea    0x30(%rax),%ecx
  mov    -0x18(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x18(%rbp)
  mov    %ecx,%edx
  mov    %dl,(%rax)
  mov    -0x18(%rbp),%rax
  pop    %rbp
  ret
```

assistant: ```c
char *put_dec_full(char *buf, unsigned q) {
  unsigned d3, d2, d1, d0;
  d1 = (q >> 4) & 0xf;
  d2 = (q >> 8) & 0xf;
  d3 = (q >> 12);
  d0 = 6 * (d3 + d2 + d1) + (q & 0xf);
  q = (d0 * 0xcd) >> 11;
  d0 = d0 - 10 * q;
  *buf++ = d0 + '0';
  d1 = q + 9 * d3 + 5 * d2 + d1;
  q = (d1 * 0xcd) >> 11;
  d1 = d1 - 10 * q;
  *buf++ = d1 + '0';
  d2 = q + 2 * d2;
  q = (d2 * 0xd) >> 7;
  d2 = d2 - 10 * q;
  *buf++ = d2 + '0';
  d3 = q + 4 * d3;
  q = (d3 * 0xcd) >> 11;
  d3 = d3 - 10 * q;
  *buf++ = d3 + '0';
  *buf++ = q + '0';
  return buf;
}
```