user: Translate the below assembly code into C programming language:

```asm
<DrawFromRGB565>:
  endbr64
  test   %ecx,%ecx
  jle    L8
  test   %edx,%edx
  jle    L8
  lea    -0x1(%rdx),%r11d
  push   %r15
  movslq %r8d,%r15
  shl    $0x2,%r8d
  push   %r14
  movslq %edx,%r14
  mov    %r11d,%edx
  xor    %r10d,%r10d
  shr    $0x2,%edx
  push   %r13
  xor    %r9d,%r9d
  lea    0x10(%rdi),%r13
  mov    %edx,%r11d
  push   %r12
  mov    %rsi,%r12
  push   %rbp
  shl    $0x2,%r11
  mov    %ecx,%ebp
  push   %rbx
  movslq %r8d,%rbx
  xor    %r8d,%r8d
  xchg   %ax,%ax
L9:
  lea    (%r9,%r11,1),%rax
  lea    (%r12,%r10,2),%rdx
  lea    0x0(%r13,%rax,4),%rsi
  mov    %rdi,%rax
L30:
  movzbl 0x1(%rdx),%ecx
  add    $0x10,%rax
  add    $0x8,%rdx
  and    $0xfffffff8,%ecx
  mov    %cl,-0xe(%rax)
  movzwl -0x8(%rdx),%ecx
  sar    $0x3,%ecx
  and    $0xfffffffc,%ecx
  mov    %cl,-0xf(%rax)
  movzbl -0x8(%rdx),%ecx
  shl    $0x3,%ecx
  mov    %cl,-0x10(%rax)
  movzbl -0x5(%rdx),%ecx
  and    $0xfffffff8,%ecx
  mov    %cl,-0xa(%rax)
  movzwl -0x6(%rdx),%ecx
  sar    $0x3,%ecx
  and    $0xfffffffc,%ecx
  mov    %cl,-0xb(%rax)
  movzbl -0x6(%rdx),%ecx
  shl    $0x3,%ecx
  mov    %cl,-0xc(%rax)
  movzbl -0x3(%rdx),%ecx
  and    $0xfffffff8,%ecx
  mov    %cl,-0x6(%rax)
  movzwl -0x4(%rdx),%ecx
  sar    $0x3,%ecx
  and    $0xfffffffc,%ecx
  mov    %cl,-0x7(%rax)
  movzbl -0x4(%rdx),%ecx
  shl    $0x3,%ecx
  mov    %cl,-0x8(%rax)
  movzbl -0x1(%rdx),%ecx
  and    $0xfffffff8,%ecx
  mov    %cl,-0x2(%rax)
  movzwl -0x2(%rdx),%ecx
  sar    $0x3,%ecx
  and    $0xfffffffc,%ecx
  mov    %cl,-0x3(%rax)
  movzbl -0x2(%rdx),%ecx
  shl    $0x3,%ecx
  mov    %cl,-0x4(%rax)
  cmp    %rax,%rsi
  jne    L30
  add    $0x1,%r8d
  add    %r15,%r9
  add    %rbx,%rdi
  add    %r14,%r10
  cmp    %r8d,%ebp
  jne    L9
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
L8:
  ret
```

assistant: ```c
void DrawFromRGB565(unsigned char *displayFrame, unsigned char *videoFrame, int videoWidth, int videoHeight, int dFrameWidth, int dFrameHeight) {
  int x, y;
  int lineLeng;
  unsigned short *videptrTemp;
  unsigned short *videoptr = videoFrame;
  int temp;
  lineLeng = dFrameWidth * 4;
  for (y = 0; y < videoHeight; y++) {
    for (x = 0; x < videoWidth;) {
      videptrTemp = videoptr + videoWidth * y + x;
      temp = y * lineLeng + x * 4;
      displayFrame[temp + 2] = (unsigned char)((*videptrTemp & 0xF800) >> 8);
      displayFrame[temp + 1] = (unsigned char)((*videptrTemp & 0x07E0) >> 3);
      displayFrame[temp + 0] = (unsigned char)((*videptrTemp & 0x001F) << 3);
      videptrTemp++;
      temp += 4;
      displayFrame[temp + 2] = (unsigned char)((*videptrTemp & 0xF800) >> 8);
      displayFrame[temp + 1] = (unsigned char)((*videptrTemp & 0x07E0) >> 3);
      displayFrame[temp + 0] = (unsigned char)((*videptrTemp & 0x001F) << 3);
      videptrTemp++;
      temp += 4;
      displayFrame[temp + 2] = (unsigned char)((*videptrTemp & 0xF800) >> 8);
      displayFrame[temp + 1] = (unsigned char)((*videptrTemp & 0x07E0) >> 3);
      displayFrame[temp + 0] = (unsigned char)((*videptrTemp & 0x001F) << 3);
      videptrTemp++;
      temp += 4;
      displayFrame[temp + 2] = (unsigned char)((*videptrTemp & 0xF800) >> 8);
      displayFrame[temp + 1] = (unsigned char)((*videptrTemp & 0x07E0) >> 3);
      displayFrame[temp + 0] = (unsigned char)((*videptrTemp & 0x001F) << 3);
      x += 4;
    }
  }
}
```