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

```asm
<main>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x50,%rsp
  mov    %fs:0x28,%rax
  mov    %rax,-0x8(%rbp)
  xor    %eax,%eax
  lea    D14(%rip),%rax
  mov    %rax,%rdi
  call   <puts@plt>
  movl   $0x1,-0x30(%rbp)
  movl   $0x0,-0x2c(%rbp)
  movl   $0x0,-0x28(%rbp)
  movl   $0x0,-0x24(%rbp)
  movl   $0x1,-0x20(%rbp)
  movl   $0x2,-0x1c(%rbp)
  movl   $0x3,-0x18(%rbp)
  movl   $0x0,-0x14(%rbp)
  movl   $0x0,-0x10(%rbp)
  movl   $0x2,-0xc(%rbp)
  movl   $0xa,-0x38(%rbp)
  lea    D6(%rip),%rax
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  movl   $0x0,-0x48(%rbp)
  jmp    L28
L46:
  mov    -0x48(%rbp),%eax
  cltq
  mov    -0x30(%rbp,%rax,4),%eax
  mov    %eax,%esi
  lea    D7(%rip),%rax
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  addl   $0x1,-0x48(%rbp)
L28:
  mov    -0x48(%rbp),%eax
  cmp    -0x38(%rbp),%eax
  jl     L46
  mov    $0xa,%edi
  call   <putchar@plt>
  movl   $0x0,-0x44(%rbp)
  jmp    L15
L54:
  mov    -0x44(%rbp),%eax
  cltq
  mov    -0x30(%rbp,%rax,4),%eax
  test   %eax,%eax
  jne    L85
  mov    -0x44(%rbp),%eax
  add    $0x1,%eax
  mov    %eax,-0x40(%rbp)
  jmp    L111
L5:
  mov    -0x40(%rbp),%eax
  cltq
  mov    -0x30(%rbp,%rax,4),%eax
  test   %eax,%eax
  je     L57
  mov    -0x40(%rbp),%eax
  cltq
  mov    -0x30(%rbp,%rax,4),%eax
  mov    %eax,-0x34(%rbp)
  mov    -0x44(%rbp),%eax
  cltq
  mov    -0x30(%rbp,%rax,4),%edx
  mov    -0x40(%rbp),%eax
  cltq
  mov    %edx,-0x30(%rbp,%rax,4)
  mov    -0x44(%rbp),%eax
  cltq
  mov    -0x34(%rbp),%edx
  mov    %edx,-0x30(%rbp,%rax,4)
  jmp    L63
L57:
  addl   $0x1,-0x40(%rbp)
L111:
  mov    -0x40(%rbp),%eax
  cmp    -0x38(%rbp),%eax
  jl     L5
  jmp    L63
L85:
  nop
L63:
  addl   $0x1,-0x44(%rbp)
L15:
  mov    -0x44(%rbp),%eax
  cmp    -0x38(%rbp),%eax
  jl     L54
  lea    D10(%rip),%rax
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  movl   $0x0,-0x3c(%rbp)
  jmp    L69
L118:
  mov    -0x3c(%rbp),%eax
  cltq
  mov    -0x30(%rbp,%rax,4),%eax
  mov    %eax,%esi
  lea    D7(%rip),%rax
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  addl   $0x1,-0x3c(%rbp)
L69:
  mov    -0x3c(%rbp),%eax
  cmp    -0x38(%rbp),%eax
  jl     L118
  mov    $0xa,%edi
  call   <putchar@plt>
  mov    $0x0,%eax
  mov    -0x8(%rbp),%rdx
  sub    %fs:0x28,%rdx
  je     L31
  call   <__stack_chk_fail@plt>
L31:
  leave
  ret
```

tool_calls: name: extract_symbolic_data
arguments: data_label: D14
type_guessed: string
name: extract_symbolic_data
arguments: data_label: D6
type_guessed: string
name: extract_symbolic_data
arguments: data_label: D7
type_guessed: string
name: extract_symbolic_data
arguments: data_label: D10
type_guessed: string

tool: D14: Move non-zero to left and zero's to right

tool: D6: Given :

tool: D7: %d 

tool: D10: Output: 

assistant: ```c
int main() {
  printf("Move non-zero to left and zero's to right\n");
  int arr[] = {1, 0, 0, 0, 1, 2, 3, 0, 0, 2};
  int len = (int)(sizeof(arr) / sizeof(int));
  printf("Given :");
  for (int i = 0; i < len; i++) {
    printf("%d ", arr[i]);
  }
  printf("\n");
  for (int i = 0; i < len; i++) {
    if (arr[i] != 0) {
      continue;
    }
    int j = i + 1;
    while (j < len) {
      if (arr[j] != 0) {
        int temp = arr[j];
        arr[j] = arr[i];
        arr[i] = temp;
        break;
      }
      j++;
    }
  }
  printf("Output: ");
  for (int i = 0; i < len; i++) {
    printf("%d ", arr[i]);
  }
  printf("\n");
  return 0;
}
```