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

```asm
<test_get_bonded_neighbors>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x90,%rsp
  mov    %edi,-0x84(%rbp)
  mov    %rsi,-0x90(%rbp)
  mov    %fs:0x28,%rax
  mov    %rax,-0x8(%rbp)
  xor    %eax,%eax
  movl   $0x12,-0x74(%rbp)
  movl   $0x12,-0x70(%rbp)
  movsd  D9(%rip),%xmm0
  movsd  %xmm0,-0x60(%rbp)
  movl   $0x2,-0x68(%rbp)
  jmp    L113
L14:
  mov    -0x68(%rbp),%eax
  cltq
  lea    0x0(,%rax,8),%rdx
  mov    -0x90(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%rax
  lea    -0x74(%rbp),%rdx
  lea    D52(%rip),%rcx
  mov    %rcx,%rsi
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <sscanf@plt>
  cmp    $0x1,%eax
  je     L118
  mov    -0x68(%rbp),%eax
  cltq
  lea    0x0(,%rax,8),%rdx
  mov    -0x90(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%rax
  lea    -0x70(%rbp),%rdx
  lea    D24(%rip),%rcx
  mov    %rcx,%rsi
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <sscanf@plt>
  cmp    $0x1,%eax
  je     L118
  mov    -0x68(%rbp),%eax
  cltq
  lea    0x0(,%rax,8),%rdx
  mov    -0x90(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%rax
  lea    -0x74(%rbp),%rdx
  lea    D26(%rip),%rcx
  mov    %rcx,%rsi
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <sscanf@plt>
  cmp    $0x1,%eax
  jne    L80
  mov    -0x74(%rbp),%eax
  mov    %eax,-0x70(%rbp)
  jmp    L118
L80:
  mov    -0x68(%rbp),%eax
  cltq
  lea    0x0(,%rax,8),%rdx
  mov    -0x90(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%rax
  lea    -0x60(%rbp),%rdx
  lea    D2(%rip),%rcx
  mov    %rcx,%rsi
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <sscanf@plt>
  cmp    $0x1,%eax
  je     L118
  mov    -0x90(%rbp),%rax
  add    $0x8,%rax
  mov    (%rax),%rcx
  mov    -0x90(%rbp),%rax
  mov    (%rax),%rax
  mov    $0x0,%edx
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <usage@plt>
L118:
  addl   $0x1,-0x68(%rbp)
L113:
  mov    -0x68(%rbp),%eax
  cmp    -0x84(%rbp),%eax
  jl     L14
  mov    -0x74(%rbp),%eax
  cmp    $0x2,%eax
  jle    L86
  mov    -0x70(%rbp),%eax
  cmp    $0x2,%eax
  jg     L25
L86:
  mov    -0x90(%rbp),%rax
  add    $0x8,%rax
  mov    (%rax),%rcx
  mov    -0x90(%rbp),%rax
  mov    (%rax),%rax
  mov    $0x1,%edx
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <usage@plt>
L25:
  mov    -0x70(%rbp),%ecx
  mov    -0x74(%rbp),%eax
  mov    $0x0,%edx
  mov    %ecx,%esi
  mov    %eax,%edi
  call   <allocate_matrix@plt>
  mov    %rax,-0x58(%rbp)
  mov    -0x70(%rbp),%ecx
  mov    -0x74(%rbp),%eax
  mov    $0x0,%edx
  mov    %ecx,%esi
  mov    %eax,%edi
  call   <allocate_matrix@plt>
  mov    %rax,-0x50(%rbp)
  mov    -0x70(%rbp),%ecx
  mov    -0x74(%rbp),%eax
  mov    $0x2e,%edx
  mov    %ecx,%esi
  mov    %eax,%edi
  call   <allocate_matrix@plt>
  mov    %rax,-0x48(%rbp)
  mov    -0x70(%rbp),%ecx
  mov    -0x74(%rbp),%edx
  lea    -0x38(%rbp),%rsi
  lea    -0x40(%rbp),%rax
  mov    %rax,%rdi
  call   <set_A1_A2@plt>
  mov    -0x60(%rbp),%rdi
  mov    -0x70(%rbp),%ecx
  mov    -0x74(%rbp),%edx
  mov    -0x50(%rbp),%rsi
  mov    -0x58(%rbp),%rax
  movq   %rdi,%xmm0
  mov    %rax,%rdi
  call   <populate_bonds@plt>
  mov    -0x70(%rbp),%r8d
  mov    -0x74(%rbp),%ecx
  lea    -0x40(%rbp),%r9
  mov    -0x50(%rbp),%rdx
  mov    -0x58(%rbp),%rsi
  mov    -0x48(%rbp),%rax
  sub    $0x8,%rsp
  lea    -0x38(%rbp),%rdi
  push   %rdi
  mov    %rax,%rdi
  call   <print_lattice@plt>
  add    $0x10,%rsp
  mov    $0xa,%edi
  call   <putchar@plt>
  mov    -0x70(%rbp),%ecx
  mov    -0x74(%rbp),%edx
  lea    -0x30(%rbp),%r9
  lea    -0x40(%rbp),%r8
  mov    -0x50(%rbp),%rsi
  mov    -0x58(%rbp),%rax
  sub    $0x8,%rsp
  lea    -0x6c(%rbp),%rdi
  push   %rdi
  mov    %rax,%rdi
  call   <get_bonded_neighbors@plt>
  add    $0x10,%rsp
  mov    -0x3c(%rbp),%edx
  mov    -0x40(%rbp),%eax
  mov    %eax,%esi
  lea    D73(%rip),%rax
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  mov    -0x6c(%rbp),%eax
  test   %eax,%eax
  jne    L58
  lea    D28(%rip),%rax
  mov    %rax,%rdi
  call   <puts@plt>
L58:
  movl   $0x0,-0x64(%rbp)
  jmp    L56
L64:
  mov    -0x64(%rbp),%eax
  cltq
  mov    -0x2c(%rbp,%rax,8),%edx
  mov    -0x64(%rbp),%eax
  cltq
  mov    -0x30(%rbp,%rax,8),%eax
  mov    %eax,%esi
  lea    D36(%rip),%rax
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  addl   $0x1,-0x64(%rbp)
L56:
  mov    -0x6c(%rbp),%eax
  cmp    %eax,-0x64(%rbp)
  jl     L64
  mov    -0x70(%rbp),%edx
  mov    -0x74(%rbp),%ecx
  mov    -0x58(%rbp),%rax
  mov    %ecx,%esi
  mov    %rax,%rdi
  call   <free_matrix@plt>
  mov    -0x70(%rbp),%edx
  mov    -0x74(%rbp),%ecx
  mov    -0x50(%rbp),%rax
  mov    %ecx,%esi
  mov    %rax,%rdi
  call   <free_matrix@plt>
  mov    -0x70(%rbp),%edx
  mov    -0x74(%rbp),%ecx
  mov    -0x48(%rbp),%rax
  mov    %ecx,%esi
  mov    %rax,%rdi
  call   <free_matrix@plt>
  nop
  mov    -0x8(%rbp),%rax
  sub    %fs:0x28,%rax
  je     L95
  call   <__stack_chk_fail@plt>
L95:
  leave
  ret
```

tool_calls: name: extract_symbolic_data
arguments: data_tag: D9
type: f64
name: extract_symbolic_data
arguments: data_tag: D52
type: string
name: extract_symbolic_data
arguments: data_tag: D24
type: string
name: extract_symbolic_data
arguments: data_tag: D26
type: string
name: extract_symbolic_data
arguments: data_tag: D2
type: string
name: extract_symbolic_data
arguments: data_tag: D73
type: string
name: extract_symbolic_data
arguments: data_tag: D28
type: string
name: extract_symbolic_data
arguments: data_tag: D36
type: string

tool: D9: 0.6

tool: D52: M=%d

tool: D24: N=%d

tool: D26: MN=%d

tool: D2: p=%lf

tool: D73: Bonded neighbors of A1 at (%d, %d):


tool: D28: (none)

tool: D36:   ( %3d, %3d )


assistant: ```c
void test_get_bonded_neighbors(int argc, char **argv) {
  int M = 18;
  int N = 18;
  double p = 0.6;
  int argi;
  int **vbonds;
  int **hbonds;
  int **site_marks;
  int A1[2];
  int A2[2];
  int neighbors[4][2];
  int numnei;
  int k;
  for (argi = 2; argi < argc; argi++) {
    if (sscanf(argv[argi], "M=%d", &M) == 1)
      ;
    else if (sscanf(argv[argi], "N=%d", &N) == 1)
      ;
    else if (sscanf(argv[argi], "MN=%d", &M) == 1)
      N = M;
    else if (sscanf(argv[argi], "p=%lf", &p) == 1)
      ;
    else
      usage(argv[0], argv[1], 0);
  }
  if ((M < 3) || (N < 3))
    usage(argv[0], argv[1], 1);
  vbonds = allocate_matrix(M, N, 0);
  hbonds = allocate_matrix(M, N, 0);
  site_marks = allocate_matrix(M, N, '.');
  set_A1_A2(A1, A2, M, N);
  populate_bonds(vbonds, hbonds, M, N, p);
  print_lattice(site_marks, vbonds, hbonds, M, N, A1, A2);
  printf("\n");
  get_bonded_neighbors(vbonds, hbonds, M, N, A1, neighbors, &numnei);
  printf("Bonded neighbors of A1 at (%d, %d):\n", A1[0], A1[1]);
  if (numnei == 0)
    printf("(none)\n");
  for (k = 0; k < numnei; k++) {
    printf("  ( %3d, %3d )\n", neighbors[k][0], neighbors[k][1]);
  }
  free_matrix(vbonds, M, N);
  free_matrix(hbonds, M, N);
  free_matrix(site_marks, M, N);
}
```