user: Please show me the C implementation that matches the assembly code listed below:

```asm
<cercle_32>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x30,%rsp
  mov    %rdi,-0x18(%rbp)
  mov    %esi,-0x1c(%rbp)
  mov    %edx,-0x20(%rbp)
  mov    %ecx,-0x24(%rbp)
  mov    %r8d,%eax
  mov    %al,-0x28(%rbp)
  movl   $0xffffffff,-0x8(%rbp)
  mov    -0x24(%rbp),%eax
  lea    (%rax,%rax,1),%edx
  mov    $0x3,%eax
  sub    %edx,%eax
  mov    %eax,-0x4(%rbp)
  jmp    L0
L4:
  cmpl   $0x0,-0x4(%rbp)
  jns    L21
  mov    -0x8(%rbp),%eax
  add    $0x3,%eax
  add    %eax,%eax
  add    %eax,-0x4(%rbp)
  addl   $0x1,-0x8(%rbp)
  jmp    L36
L21:
  mov    -0x8(%rbp),%eax
  sub    -0x24(%rbp),%eax
  shl    $0x2,%eax
  add    $0xa,%eax
  add    %eax,-0x4(%rbp)
  addl   $0x1,-0x8(%rbp)
  subl   $0x1,-0x24(%rbp)
L36:
  movzbl -0x28(%rbp),%edx
  mov    -0x24(%rbp),%ecx
  mov    -0x20(%rbp),%eax
  lea    (%rcx,%rax,1),%edi
  mov    -0x1c(%rbp),%ecx
  mov    -0x8(%rbp),%eax
  lea    (%rcx,%rax,1),%esi
  mov    -0x18(%rbp),%rax
  mov    %edx,%ecx
  mov    %edi,%edx
  mov    %rax,%rdi
  call   <tracer_point_add_32@plt>
  movzbl -0x28(%rbp),%edx
  mov    -0x8(%rbp),%ecx
  mov    -0x20(%rbp),%eax
  lea    (%rcx,%rax,1),%edi
  mov    -0x1c(%rbp),%ecx
  mov    -0x24(%rbp),%eax
  lea    (%rcx,%rax,1),%esi
  mov    -0x18(%rbp),%rax
  mov    %edx,%ecx
  mov    %edi,%edx
  mov    %rax,%rdi
  call   <tracer_point_add_32@plt>
  movzbl -0x28(%rbp),%edx
  mov    -0x8(%rbp),%ecx
  mov    -0x20(%rbp),%eax
  lea    (%rcx,%rax,1),%edi
  mov    -0x1c(%rbp),%eax
  sub    -0x24(%rbp),%eax
  mov    %eax,%esi
  mov    -0x18(%rbp),%rax
  mov    %edx,%ecx
  mov    %edi,%edx
  mov    %rax,%rdi
  call   <tracer_point_add_32@plt>
  movzbl -0x28(%rbp),%edx
  mov    -0x24(%rbp),%ecx
  mov    -0x20(%rbp),%eax
  lea    (%rcx,%rax,1),%edi
  mov    -0x1c(%rbp),%eax
  sub    -0x8(%rbp),%eax
  mov    %eax,%esi
  mov    -0x18(%rbp),%rax
  mov    %edx,%ecx
  mov    %edi,%edx
  mov    %rax,%rdi
  call   <tracer_point_add_32@plt>
  movzbl -0x28(%rbp),%ecx
  mov    -0x20(%rbp),%eax
  sub    -0x24(%rbp),%eax
  mov    %eax,%edx
  mov    -0x1c(%rbp),%eax
  sub    -0x8(%rbp),%eax
  mov    %eax,%esi
  mov    -0x18(%rbp),%rax
  mov    %rax,%rdi
  call   <tracer_point_add_32@plt>
  movzbl -0x28(%rbp),%ecx
  mov    -0x20(%rbp),%eax
  sub    -0x8(%rbp),%eax
  mov    %eax,%edx
  mov    -0x1c(%rbp),%eax
  sub    -0x24(%rbp),%eax
  mov    %eax,%esi
  mov    -0x18(%rbp),%rax
  mov    %rax,%rdi
  call   <tracer_point_add_32@plt>
  movzbl -0x28(%rbp),%ecx
  mov    -0x20(%rbp),%eax
  sub    -0x8(%rbp),%eax
  mov    %eax,%edx
  mov    -0x1c(%rbp),%esi
  mov    -0x24(%rbp),%eax
  add    %eax,%esi
  mov    -0x18(%rbp),%rax
  mov    %rax,%rdi
  call   <tracer_point_add_32@plt>
  movzbl -0x28(%rbp),%ecx
  mov    -0x20(%rbp),%eax
  sub    -0x24(%rbp),%eax
  mov    %eax,%edx
  mov    -0x1c(%rbp),%esi
  mov    -0x8(%rbp),%eax
  add    %eax,%esi
  mov    -0x18(%rbp),%rax
  mov    %rax,%rdi
  call   <tracer_point_add_32@plt>
L0:
  mov    -0x8(%rbp),%eax
  cmp    -0x24(%rbp),%eax
  jle    L4
  nop
  nop
  leave
  ret
```

assistant: ```c
void cercle_32(unsigned char *buffer, int h, int k, int y, unsigned char color) {
  int x = -1, d = 3 - 2 * y;
  while (x <= y) {
    if (d < 0) {
      d += 2 * x + 6;
      x++;
    } else {
      d += 4 * (x - y) + 10;
      x++;
      y--;
    }
    tracer_point_add_32(buffer, h + x, y + k, color);
    tracer_point_add_32(buffer, h + y, x + k, color);
    tracer_point_add_32(buffer, h - y, x + k, color);
    tracer_point_add_32(buffer, h - x, y + k, color);
    tracer_point_add_32(buffer, h - x, -y + k, color);
    tracer_point_add_32(buffer, h - y, -x + k, color);
    tracer_point_add_32(buffer, h + y, -x + k, color);
    tracer_point_add_32(buffer, h + x, -y + k, color);
  }
}
```