user: What is the c source code of the assembly code below?

```asm
<lcd_draw_circle>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x30,%rsp
  mov    %edi,-0x14(%rbp)
  mov    %esi,-0x18(%rbp)
  mov    %edx,-0x1c(%rbp)
  mov    %ecx,%eax
  mov    %r8d,-0x24(%rbp)
  mov    %al,-0x20(%rbp)
  movl   $0x0,-0xc(%rbp)
  mov    -0x1c(%rbp),%eax
  mov    %eax,-0x8(%rbp)
  mov    $0x1,%eax
  sub    -0x1c(%rbp),%eax
  mov    %eax,-0x4(%rbp)
L9:
  cmpb   $0x0,-0x20(%rbp)
  je     L34
  mov    -0x8(%rbp),%edx
  mov    -0x18(%rbp),%eax
  lea    (%rdx,%rax,1),%ecx
  mov    -0xc(%rbp),%edx
  mov    -0x14(%rbp),%eax
  add    %eax,%edx
  mov    -0x8(%rbp),%esi
  mov    -0x18(%rbp),%eax
  add    %eax,%esi
  mov    -0xc(%rbp),%edi
  mov    -0x14(%rbp),%eax
  sub    %edi,%eax
  mov    -0x24(%rbp),%edi
  mov    %edi,%r8d
  mov    %eax,%edi
  call   <lcd_draw_line@plt>
  mov    -0x8(%rbp),%edx
  mov    -0x18(%rbp),%eax
  sub    %edx,%eax
  mov    %eax,%ecx
  mov    -0xc(%rbp),%edx
  mov    -0x14(%rbp),%eax
  add    %eax,%edx
  mov    -0x8(%rbp),%edi
  mov    -0x18(%rbp),%eax
  sub    %edi,%eax
  mov    %eax,%esi
  mov    -0xc(%rbp),%edi
  mov    -0x14(%rbp),%eax
  sub    %edi,%eax
  mov    -0x24(%rbp),%edi
  mov    %edi,%r8d
  mov    %eax,%edi
  call   <lcd_draw_line@plt>
  mov    -0xc(%rbp),%edx
  mov    -0x18(%rbp),%eax
  lea    (%rdx,%rax,1),%ecx
  mov    -0x8(%rbp),%edx
  mov    -0x14(%rbp),%eax
  add    %eax,%edx
  mov    -0xc(%rbp),%esi
  mov    -0x18(%rbp),%eax
  add    %eax,%esi
  mov    -0x8(%rbp),%edi
  mov    -0x14(%rbp),%eax
  sub    %edi,%eax
  mov    -0x24(%rbp),%edi
  mov    %edi,%r8d
  mov    %eax,%edi
  call   <lcd_draw_line@plt>
  mov    -0xc(%rbp),%edx
  mov    -0x18(%rbp),%eax
  sub    %edx,%eax
  mov    %eax,%ecx
  mov    -0x8(%rbp),%edx
  mov    -0x14(%rbp),%eax
  add    %eax,%edx
  mov    -0xc(%rbp),%edi
  mov    -0x18(%rbp),%eax
  sub    %edi,%eax
  mov    %eax,%esi
  mov    -0x8(%rbp),%edi
  mov    -0x14(%rbp),%eax
  sub    %edi,%eax
  mov    -0x24(%rbp),%edi
  mov    %edi,%r8d
  mov    %eax,%edi
  call   <lcd_draw_line@plt>
  jmp    L40
L34:
  mov    -0x8(%rbp),%edx
  mov    -0x18(%rbp),%eax
  lea    (%rdx,%rax,1),%esi
  mov    -0xc(%rbp),%edx
  mov    -0x14(%rbp),%eax
  lea    (%rdx,%rax,1),%ecx
  mov    -0x24(%rbp),%eax
  mov    %eax,%edx
  mov    %ecx,%edi
  call   <lcd_write_pixel@plt>
  mov    -0xc(%rbp),%edx
  mov    -0x18(%rbp),%eax
  lea    (%rdx,%rax,1),%esi
  mov    -0x8(%rbp),%edx
  mov    -0x14(%rbp),%eax
  lea    (%rdx,%rax,1),%ecx
  mov    -0x24(%rbp),%eax
  mov    %eax,%edx
  mov    %ecx,%edi
  call   <lcd_write_pixel@plt>
  mov    -0x8(%rbp),%edx
  mov    -0x18(%rbp),%eax
  lea    (%rdx,%rax,1),%esi
  mov    -0xc(%rbp),%edx
  mov    -0x14(%rbp),%eax
  sub    %edx,%eax
  mov    %eax,%ecx
  mov    -0x24(%rbp),%eax
  mov    %eax,%edx
  mov    %ecx,%edi
  call   <lcd_write_pixel@plt>
  mov    -0xc(%rbp),%edx
  mov    -0x18(%rbp),%eax
  lea    (%rdx,%rax,1),%esi
  mov    -0x8(%rbp),%edx
  mov    -0x14(%rbp),%eax
  sub    %edx,%eax
  mov    %eax,%ecx
  mov    -0x24(%rbp),%eax
  mov    %eax,%edx
  mov    %ecx,%edi
  call   <lcd_write_pixel@plt>
  mov    -0xc(%rbp),%edx
  mov    -0x18(%rbp),%eax
  sub    %edx,%eax
  mov    %eax,%esi
  mov    -0x8(%rbp),%edx
  mov    -0x14(%rbp),%eax
  lea    (%rdx,%rax,1),%ecx
  mov    -0x24(%rbp),%eax
  mov    %eax,%edx
  mov    %ecx,%edi
  call   <lcd_write_pixel@plt>
  mov    -0x8(%rbp),%edx
  mov    -0x18(%rbp),%eax
  sub    %edx,%eax
  mov    %eax,%esi
  mov    -0xc(%rbp),%edx
  mov    -0x14(%rbp),%eax
  lea    (%rdx,%rax,1),%ecx
  mov    -0x24(%rbp),%eax
  mov    %eax,%edx
  mov    %ecx,%edi
  call   <lcd_write_pixel@plt>
  mov    -0x8(%rbp),%edx
  mov    -0x18(%rbp),%eax
  sub    %edx,%eax
  mov    %eax,%esi
  mov    -0xc(%rbp),%edx
  mov    -0x14(%rbp),%eax
  sub    %edx,%eax
  mov    %eax,%ecx
  mov    -0x24(%rbp),%eax
  mov    %eax,%edx
  mov    %ecx,%edi
  call   <lcd_write_pixel@plt>
  mov    -0xc(%rbp),%edx
  mov    -0x18(%rbp),%eax
  sub    %edx,%eax
  mov    %eax,%esi
  mov    -0x8(%rbp),%edx
  mov    -0x14(%rbp),%eax
  sub    %edx,%eax
  mov    %eax,%ecx
  mov    -0x24(%rbp),%eax
  mov    %eax,%edx
  mov    %ecx,%edi
  call   <lcd_write_pixel@plt>
L40:
  cmpl   $0x0,-0x4(%rbp)
  jns    L35
  mov    -0xc(%rbp),%eax
  lea    0x1(%rax),%edx
  mov    %edx,-0xc(%rbp)
  add    %eax,%eax
  add    $0x3,%eax
  add    %eax,-0x4(%rbp)
  jmp    L1
L35:
  mov    -0xc(%rbp),%eax
  lea    0x1(%rax),%edx
  mov    %edx,-0xc(%rbp)
  mov    -0x8(%rbp),%edx
  lea    -0x1(%rdx),%ecx
  mov    %ecx,-0x8(%rbp)
  sub    %edx,%eax
  add    %eax,%eax
  add    $0x5,%eax
  add    %eax,-0x4(%rbp)
L1:
  mov    -0xc(%rbp),%eax
  cmp    -0x8(%rbp),%eax
  jle    L9
  nop
  nop
  leave
  ret
```

assistant: ```c
void lcd_draw_circle(unsigned int x0, unsigned int y0, unsigned int radius, char fill, int color) {
  int x_offset, y_offset, error;
  x_offset = 0;
  y_offset = radius;
  error = 1 - radius;
  do {
    if (fill) {
      lcd_draw_line(x0 - x_offset, y0 + y_offset, x0 + x_offset, y0 + y_offset, color);
      lcd_draw_line(x0 - x_offset, y0 - y_offset, x0 + x_offset, y0 - y_offset, color);
      lcd_draw_line(x0 - y_offset, y0 + x_offset, x0 + y_offset, y0 + x_offset, color);
      lcd_draw_line(x0 - y_offset, y0 - x_offset, x0 + y_offset, y0 - x_offset, color);
    } else {
      lcd_write_pixel(x_offset + x0, y_offset + y0, color);
      lcd_write_pixel(y_offset + x0, x_offset + y0, color);
      lcd_write_pixel(x0 - x_offset, y_offset + y0, color);
      lcd_write_pixel(x0 - y_offset, x_offset + y0, color);
      lcd_write_pixel(y_offset + x0, y0 - x_offset, color);
      lcd_write_pixel(x_offset + x0, y0 - y_offset, color);
      lcd_write_pixel(x0 - x_offset, y0 - y_offset, color);
      lcd_write_pixel(x0 - y_offset, y0 - x_offset, color);
    }
    if (error < 0)
      error += (3 + (2 * (x_offset++)));
    else
      error += (5 + (2 * ((x_offset++) - (y_offset--))));
  } while (x_offset <= y_offset);
}
```