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

```asm
<oled_circle>:
  endbr64
  push   %r15
  push   %r14
  mov    %edx,%r14d
  push   %r13
  push   %r12
  mov    %ecx,%r12d
  mov    $0x1,%ecx
  push   %rbp
  mov    %r12d,%eax
  lea    (%r12,%rdx,1),%r13d
  sub    %r12d,%ecx
  push   %rbx
  neg    %eax
  mov    %r13d,%edx
  mov    %edi,%ebx
  add    %eax,%eax
  mov    %esi,%ebp
  lea    (%r12,%rbp,1),%r15d
  sub    $0x28,%rsp
  mov    %ecx,0xc(%rsp)
  mov    %esi,0x8(%rsp)
  mov    %eax,0x1c(%rsp)
  call   <oled_pixel@plt>
  mov    %r14d,%edx
  mov    %ebp,%esi
  mov    %ebx,%edi
  sub    %r12d,%edx
  call   <oled_pixel@plt>
  mov    %r14d,%edx
  mov    %r15d,%esi
  mov    %ebx,%edi
  call   <oled_pixel@plt>
  mov    %ebp,%esi
  mov    %r14d,%edx
  mov    %ebx,%edi
  sub    %r12d,%esi
  call   <oled_pixel@plt>
  test   %r12d,%r12d
  jle    L24
  mov    0xc(%rsp),%ecx
  xor    %ebp,%ebp
  nopl   0x0(%rax)
L8:
  test   %ecx,%ecx
  js     L4
  addl   $0x2,0x1c(%rsp)
  mov    0x1c(%rsp),%eax
  sub    $0x1,%r12d
  lea    (%r12,%r14,1),%r13d
  add    %eax,%ecx
  mov    0x8(%rsp),%eax
  lea    (%r12,%rax,1),%r15d
L4:
  mov    0x8(%rsp),%eax
  add    $0x1,%ebp
  mov    %r13d,%edx
  mov    %ebx,%edi
  lea    0x1(%rcx,%rbp,2),%ecx
  lea    (%rax,%rbp,1),%r10d
  mov    %ecx,0x18(%rsp)
  mov    %r10d,%esi
  mov    %r10d,0x14(%rsp)
  call   <oled_pixel@plt>
  mov    0x8(%rsp),%r8d
  mov    %r13d,%edx
  mov    %ebx,%edi
  sub    %ebp,%r8d
  mov    %r8d,%esi
  mov    %r8d,0x10(%rsp)
  call   <oled_pixel@plt>
  mov    0x14(%rsp),%esi
  mov    %r14d,%edx
  mov    %ebx,%edi
  sub    %r12d,%edx
  mov    %edx,0xc(%rsp)
  call   <oled_pixel@plt>
  mov    0xc(%rsp),%edx
  mov    0x10(%rsp),%esi
  mov    %ebx,%edi
  call   <oled_pixel@plt>
  lea    0x0(%rbp,%r14,1),%edx
  mov    %r15d,%esi
  mov    %ebx,%edi
  mov    %edx,0xc(%rsp)
  call   <oled_pixel@plt>
  mov    0x8(%rsp),%r8d
  mov    0xc(%rsp),%edx
  mov    %ebx,%edi
  sub    %r12d,%r8d
  mov    %r8d,%esi
  mov    %r8d,0x10(%rsp)
  call   <oled_pixel@plt>
  mov    %r14d,%edx
  mov    %r15d,%esi
  mov    %ebx,%edi
  sub    %ebp,%edx
  mov    %edx,0xc(%rsp)
  call   <oled_pixel@plt>
  mov    0xc(%rsp),%edx
  mov    0x10(%rsp),%esi
  mov    %ebx,%edi
  call   <oled_pixel@plt>
  cmp    %ebp,%r12d
  mov    0x18(%rsp),%ecx
  jg     L8
L24:
  add    $0x28,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
```

assistant: ```c
void oled_circle(int color, int x0, int y0, int radius) {
  int f = 1 - radius;
  int ddF_x = 0;
  int ddF_y = -2 * radius;
  int x = 0;
  int y = radius;
  oled_pixel(color, x0, y0 + radius);
  oled_pixel(color, x0, y0 - radius);
  oled_pixel(color, x0 + radius, y0);
  oled_pixel(color, x0 - radius, y0);
  while (x < y) {
    if (f >= 0) {
      y--;
      ddF_y += 2;
      f += ddF_y;
    }
    x++;
    ddF_x += 2;
    f += ddF_x + 1;
    oled_pixel(color, x0 + x, y0 + y);
    oled_pixel(color, x0 - x, y0 + y);
    oled_pixel(color, x0 + x, y0 - y);
    oled_pixel(color, x0 - x, y0 - y);
    oled_pixel(color, x0 + y, y0 + x);
    oled_pixel(color, x0 - y, y0 + x);
    oled_pixel(color, x0 + y, y0 - x);
    oled_pixel(color, x0 - y, y0 - x);
  }
}
```