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

```asm
<vp8cx_vertical_band_4_5_scale_c>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  mov    %rdi,-0x28(%rbp)
  mov    %esi,-0x2c(%rbp)
  mov    %edx,-0x30(%rbp)
  mov    -0x28(%rbp),%rax
  mov    %rax,-0x8(%rbp)
  movl   $0x0,-0x1c(%rbp)
  jmp    L17
L7:
  mov    -0x8(%rbp),%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  mov    %eax,-0x18(%rbp)
  mov    -0x2c(%rbp),%edx
  mov    -0x8(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  mov    %eax,-0x14(%rbp)
  mov    -0x18(%rbp),%eax
  imul   $0x33,%eax,%edx
  mov    -0x14(%rbp),%eax
  imul   $0xcd,%eax,%eax
  add    %edx,%eax
  sub    $0xffffff80,%eax
  shr    $0x8,%eax
  mov    %eax,%ecx
  mov    -0x2c(%rbp),%edx
  mov    -0x8(%rbp),%rax
  add    %rdx,%rax
  mov    %ecx,%edx
  mov    %dl,(%rax)
  mov    -0x2c(%rbp),%eax
  add    %eax,%eax
  mov    %eax,%edx
  mov    -0x8(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  imul   $0x9a,%eax,%eax
  mov    %eax,-0x10(%rbp)
  mov    -0x2c(%rbp),%edx
  mov    %edx,%eax
  add    %eax,%eax
  add    %edx,%eax
  mov    %eax,%edx
  mov    -0x8(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  mov    %eax,-0xc(%rbp)
  mov    -0x14(%rbp),%eax
  imul   $0x66,%eax,%edx
  mov    -0x10(%rbp),%eax
  add    %edx,%eax
  sub    $0xffffff80,%eax
  shr    $0x8,%eax
  mov    %eax,%edx
  mov    -0x2c(%rbp),%eax
  add    %eax,%eax
  mov    %eax,%ecx
  mov    -0x8(%rbp),%rax
  add    %rcx,%rax
  mov    %dl,(%rax)
  mov    -0xc(%rbp),%eax
  imul   $0x66,%eax,%edx
  mov    -0x10(%rbp),%eax
  add    %edx,%eax
  sub    $0xffffff80,%eax
  shr    $0x8,%eax
  mov    %eax,%ecx
  mov    -0x2c(%rbp),%edx
  mov    %edx,%eax
  add    %eax,%eax
  add    %edx,%eax
  mov    %eax,%edx
  mov    -0x8(%rbp),%rax
  add    %rdx,%rax
  mov    %ecx,%edx
  mov    %dl,(%rax)
  mov    -0x2c(%rbp),%edx
  mov    %edx,%eax
  shl    $0x2,%eax
  add    %edx,%eax
  mov    %eax,%edx
  mov    -0x8(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  mov    %eax,-0x18(%rbp)
  mov    -0xc(%rbp),%eax
  imul   $0xcd,%eax,%edx
  mov    -0x18(%rbp),%eax
  imul   $0x33,%eax,%eax
  add    %edx,%eax
  sub    $0xffffff80,%eax
  shr    $0x8,%eax
  mov    %eax,%edx
  mov    -0x2c(%rbp),%eax
  shl    $0x2,%eax
  mov    %eax,%ecx
  mov    -0x8(%rbp),%rax
  add    %rcx,%rax
  mov    %dl,(%rax)
  addq   $0x1,-0x8(%rbp)
  addl   $0x1,-0x1c(%rbp)
L17:
  mov    -0x1c(%rbp),%eax
  cmp    -0x30(%rbp),%eax
  jb     L7
  nop
  nop
  pop    %rbp
  ret
```

assistant: ```c
void vp8cx_vertical_band_4_5_scale_c(unsigned char *dest, unsigned int dest_pitch, unsigned int dest_width) {
  unsigned int i;
  unsigned int a, b, c, d;
  unsigned char *des = dest;
  for (i = 0; i < dest_width; i++) {
    a = des[0];
    b = des[dest_pitch];
    des[dest_pitch] = (unsigned char)((a * 51 + 205 * b + 128) >> 8);
    c = des[dest_pitch * 2] * 154;
    d = des[dest_pitch * 3];
    des[dest_pitch * 2] = (unsigned char)((b * 102 + c + 128) >> 8);
    des[dest_pitch * 3] = (unsigned char)((c + 102 * d + 128) >> 8);
    a = des[dest_pitch * 5];
    des[dest_pitch * 4] = (unsigned char)((d * 205 + 51 * a + 128) >> 8);
    des++;
  }
}
```