user: 请显示与下面列出的汇编代码相匹配的C语言实现:

```asm
<alcon2009_draw_rectangle>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  mov    %rdi,-0x28(%rbp)
  mov    %esi,-0x2c(%rbp)
  mov    %edx,-0x30(%rbp)
  mov    %ecx,-0x34(%rbp)
  mov    %r8d,-0x38(%rbp)
  mov    %r9d,-0x3c(%rbp)
  mov    0x18(%rbp),%ecx
  mov    0x20(%rbp),%edx
  mov    0x28(%rbp),%eax
  mov    %cl,-0x40(%rbp)
  mov    %dl,-0x44(%rbp)
  mov    %al,-0x48(%rbp)
  mov    -0x38(%rbp),%eax
  mov    %eax,-0x18(%rbp)
  jmp    L171
L74:
  movl   $0x0,-0x14(%rbp)
  jmp    L47
L126:
  mov    -0x34(%rbp),%eax
  sub    -0x14(%rbp),%eax
  mov    %eax,-0x8(%rbp)
  mov    -0x3c(%rbp),%edx
  mov    -0x14(%rbp),%eax
  add    %edx,%eax
  mov    %eax,-0x4(%rbp)
  cmpl   $0x0,-0x38(%rbp)
  js     L105
  mov    -0x38(%rbp),%eax
  cmp    -0x30(%rbp),%eax
  jge    L105
  cmpl   $0x0,-0x8(%rbp)
  js     L143
  mov    -0x8(%rbp),%eax
  cmp    -0x2c(%rbp),%eax
  jge    L143
  mov    -0x18(%rbp),%eax
  imul   -0x2c(%rbp),%eax
  mov    %eax,%edx
  mov    -0x8(%rbp),%eax
  add    %eax,%edx
  mov    %edx,%eax
  add    %eax,%eax
  add    %edx,%eax
  movslq %eax,%rdx
  mov    -0x28(%rbp),%rax
  add    %rax,%rdx
  movzbl -0x40(%rbp),%eax
  mov    %al,(%rdx)
  mov    -0x18(%rbp),%eax
  imul   -0x2c(%rbp),%eax
  mov    %eax,%edx
  mov    -0x8(%rbp),%eax
  add    %eax,%edx
  mov    %edx,%eax
  add    %eax,%eax
  add    %edx,%eax
  cltq
  lea    0x1(%rax),%rdx
  mov    -0x28(%rbp),%rax
  add    %rax,%rdx
  movzbl -0x44(%rbp),%eax
  mov    %al,(%rdx)
  mov    -0x18(%rbp),%eax
  imul   -0x2c(%rbp),%eax
  mov    %eax,%edx
  mov    -0x8(%rbp),%eax
  add    %eax,%edx
  mov    %edx,%eax
  add    %eax,%eax
  add    %edx,%eax
  cltq
  lea    0x2(%rax),%rdx
  mov    -0x28(%rbp),%rax
  add    %rax,%rdx
  movzbl -0x48(%rbp),%eax
  mov    %al,(%rdx)
L143:
  cmpl   $0x0,-0x4(%rbp)
  js     L105
  mov    -0x4(%rbp),%eax
  cmp    -0x2c(%rbp),%eax
  jge    L105
  mov    -0x18(%rbp),%eax
  imul   -0x2c(%rbp),%eax
  mov    %eax,%edx
  mov    -0x4(%rbp),%eax
  add    %eax,%edx
  mov    %edx,%eax
  add    %eax,%eax
  add    %edx,%eax
  movslq %eax,%rdx
  mov    -0x28(%rbp),%rax
  add    %rax,%rdx
  movzbl -0x40(%rbp),%eax
  mov    %al,(%rdx)
  mov    -0x18(%rbp),%eax
  imul   -0x2c(%rbp),%eax
  mov    %eax,%edx
  mov    -0x4(%rbp),%eax
  add    %eax,%edx
  mov    %edx,%eax
  add    %eax,%eax
  add    %edx,%eax
  cltq
  lea    0x1(%rax),%rdx
  mov    -0x28(%rbp),%rax
  add    %rax,%rdx
  movzbl -0x44(%rbp),%eax
  mov    %al,(%rdx)
  mov    -0x18(%rbp),%eax
  imul   -0x2c(%rbp),%eax
  mov    %eax,%edx
  mov    -0x4(%rbp),%eax
  add    %eax,%edx
  mov    %edx,%eax
  add    %eax,%eax
  add    %edx,%eax
  cltq
  lea    0x2(%rax),%rdx
  mov    -0x28(%rbp),%rax
  add    %rax,%rdx
  movzbl -0x48(%rbp),%eax
  mov    %al,(%rdx)
L105:
  addl   $0x1,-0x14(%rbp)
L47:
  cmpl   $0x3,-0x14(%rbp)
  jle    L126
  addl   $0x1,-0x18(%rbp)
L171:
  mov    -0x18(%rbp),%eax
  cmp    0x10(%rbp),%eax
  jle    L74
  mov    -0x34(%rbp),%eax
  sub    $0x3,%eax
  mov    %eax,-0x18(%rbp)
  jmp    L28
L86:
  movl   $0x0,-0x14(%rbp)
  jmp    L17
L160:
  mov    -0x38(%rbp),%eax
  sub    -0x14(%rbp),%eax
  mov    %eax,-0x10(%rbp)
  mov    0x10(%rbp),%edx
  mov    -0x14(%rbp),%eax
  add    %edx,%eax
  mov    %eax,-0xc(%rbp)
  cmpl   $0x0,-0x34(%rbp)
  js     L140
  mov    -0x34(%rbp),%eax
  cmp    -0x2c(%rbp),%eax
  jge    L140
  cmpl   $0x0,-0x10(%rbp)
  js     L58
  mov    -0x10(%rbp),%eax
  cmp    -0x30(%rbp),%eax
  jge    L58
  mov    -0x10(%rbp),%eax
  imul   -0x2c(%rbp),%eax
  mov    %eax,%edx
  mov    -0x18(%rbp),%eax
  add    %eax,%edx
  mov    %edx,%eax
  add    %eax,%eax
  add    %edx,%eax
  movslq %eax,%rdx
  mov    -0x28(%rbp),%rax
  add    %rax,%rdx
  movzbl -0x40(%rbp),%eax
  mov    %al,(%rdx)
  mov    -0x10(%rbp),%eax
  imul   -0x2c(%rbp),%eax
  mov    %eax,%edx
  mov    -0x18(%rbp),%eax
  add    %eax,%edx
  mov    %edx,%eax
  add    %eax,%eax
  add    %edx,%eax
  cltq
  lea    0x1(%rax),%rdx
  mov    -0x28(%rbp),%rax
  add    %rax,%rdx
  movzbl -0x44(%rbp),%eax
  mov    %al,(%rdx)
  mov    -0x10(%rbp),%eax
  imul   -0x2c(%rbp),%eax
  mov    %eax,%edx
  mov    -0x18(%rbp),%eax
  add    %eax,%edx
  mov    %edx,%eax
  add    %eax,%eax
  add    %edx,%eax
  cltq
  lea    0x2(%rax),%rdx
  mov    -0x28(%rbp),%rax
  add    %rax,%rdx
  movzbl -0x48(%rbp),%eax
  mov    %al,(%rdx)
L58:
  cmpl   $0x0,-0xc(%rbp)
  js     L140
  mov    -0xc(%rbp),%eax
  cmp    -0x30(%rbp),%eax
  jge    L140
  mov    -0xc(%rbp),%eax
  imul   -0x2c(%rbp),%eax
  mov    %eax,%edx
  mov    -0x18(%rbp),%eax
  add    %eax,%edx
  mov    %edx,%eax
  add    %eax,%eax
  add    %edx,%eax
  movslq %eax,%rdx
  mov    -0x28(%rbp),%rax
  add    %rax,%rdx
  movzbl -0x40(%rbp),%eax
  mov    %al,(%rdx)
  mov    -0xc(%rbp),%eax
  imul   -0x2c(%rbp),%eax
  mov    %eax,%edx
  mov    -0x18(%rbp),%eax
  add    %eax,%edx
  mov    %edx,%eax
  add    %eax,%eax
  add    %edx,%eax
  cltq
  lea    0x1(%rax),%rdx
  mov    -0x28(%rbp),%rax
  add    %rax,%rdx
  movzbl -0x44(%rbp),%eax
  mov    %al,(%rdx)
  mov    -0xc(%rbp),%eax
  imul   -0x2c(%rbp),%eax
  mov    %eax,%edx
  mov    -0x18(%rbp),%eax
  add    %eax,%edx
  mov    %edx,%eax
  add    %eax,%eax
  add    %edx,%eax
  cltq
  lea    0x2(%rax),%rdx
  mov    -0x28(%rbp),%rax
  add    %rax,%rdx
  movzbl -0x48(%rbp),%eax
  mov    %al,(%rdx)
L140:
  addl   $0x1,-0x14(%rbp)
L17:
  cmpl   $0x3,-0x14(%rbp)
  jle    L160
  addl   $0x1,-0x18(%rbp)
L28:
  mov    -0x3c(%rbp),%eax
  add    $0x3,%eax
  cmp    %eax,-0x18(%rbp)
  jle    L86
  nop
  nop
  pop    %rbp
  ret
```

assistant: ```c
void alcon2009_draw_rectangle(unsigned char *image, int width, int height, int x1, int y1, int x2, int y2, unsigned char r, unsigned char g, unsigned char b) {
  int i, w;
  for (i = y1; i <= y2; i++) {
    for (w = 0; w < 4; w++) {
      int xx1 = x1 - w;
      int xx2 = x2 + w;
      if (y1 >= 0 && y1 < height) {
        if (xx1 >= 0 && xx1 < width) {
          image[(xx1 + i * width) * 3 + 0] = r;
          image[(xx1 + i * width) * 3 + 1] = g;
          image[(xx1 + i * width) * 3 + 2] = b;
        }
        if (xx2 >= 0 && xx2 < width) {
          image[(xx2 + i * width) * 3 + 0] = r;
          image[(xx2 + i * width) * 3 + 1] = g;
          image[(xx2 + i * width) * 3 + 2] = b;
        }
      }
    }
  }
  for (i = x1 - 4 + 1; i <= x2 + 4 - 1; i++) {
    for (w = 0; w < 4; w++) {
      int yy1 = y1 - w;
      int yy2 = y2 + w;
      if (x1 >= 0 && x1 < width) {
        if (yy1 >= 0 && yy1 < height) {
          image[(i + yy1 * width) * 3 + 0] = r;
          image[(i + yy1 * width) * 3 + 1] = g;
          image[(i + yy1 * width) * 3 + 2] = b;
        }
        if (yy2 >= 0 && yy2 < height) {
          image[(i + yy2 * width) * 3 + 0] = r;
          image[(i + yy2 * width) * 3 + 1] = g;
          image[(i + yy2 * width) * 3 + 2] = b;
        }
      }
    }
  }
}
```