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

```asm
<main>:
  endbr64
  push   %rbx
  sub    $0x1000,%rsp
  orq    $0x0,(%rsp)
  sub    $0x1000,%rsp
  orq    $0x0,(%rsp)
  sub    $0x1000,%rsp
  orq    $0x0,(%rsp)
  sub    $0x3d0,%rsp
  mov    %rsi,%rbx
  mov    %fs:0x28,%rax
  mov    %rax,0x33c8(%rsp)
  xor    %eax,%eax
  cmp    $0x2,%edi
  jne    L207
L361:
  lea    0x18c0(%rsp),%rsi
  mov    0x8(%rbx),%rdi
  call   <Load_Mem@plt>
  cmp    $0x6c0,%eax
  jne    L486
L300:
  lea    0x18c0(%rsp),%rax
  lea    0x1b00(%rsp),%rsi
  mov    $0x0,%edx
L502:
  mov    (%rax),%ecx
  mov    %ecx,(%rsp,%rdx,1)
  mov    0x240(%rax),%ecx
  mov    %ecx,0x240(%rsp,%rdx,1)
  mov    0x480(%rax),%ecx
  mov    %ecx,0x480(%rsp,%rdx,1)
  mov    0x6c0(%rax),%ecx
  mov    %ecx,0x6c0(%rsp,%rdx,1)
  mov    0x900(%rax),%ecx
  mov    %ecx,0x900(%rsp,%rdx,1)
  mov    0xb40(%rax),%ecx
  mov    %ecx,0xb40(%rsp,%rdx,1)
  mov    0xd80(%rax),%ecx
  mov    %ecx,0xd80(%rsp,%rdx,1)
  mov    0x1200(%rax),%ecx
  mov    %ecx,0xfc0(%rsp,%rdx,1)
  mov    0x1440(%rax),%ecx
  mov    %ecx,0x1200(%rsp,%rdx,1)
  mov    0x1680(%rax),%ecx
  mov    %ecx,0x1440(%rsp,%rdx,1)
  mov    0x18c0(%rax),%ecx
  mov    %ecx,0x1680(%rsp,%rdx,1)
  add    $0x4,%rax
  add    $0x4,%rdx
  cmp    %rsi,%rax
  jne    L502
  mov    %rsp,%rsi
  lea    0xfc0(%rsp),%rdi
  mov    $0x90,%edx
  call   <compare@plt>
  mov    $0x0,%ebx
  cmp    $0x1,%eax
  jne    L161
L431:
  lea    D12(%rip),%rdi
  call   <puts@plt>
  mov    %ebx,%esi
  lea    D4(%rip),%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  mov    0x33c8(%rsp),%rax
  sub    %fs:0x28,%rax
  jne    L416
  mov    %ebx,%eax
  add    $0x33d0,%rsp
  pop    %rbx
  ret
L207:
  lea    D23(%rip),%rdi
  call   <puts@plt>
  mov    $0x1,%edi
  call   <exit@plt>
  jmp    L361
L486:
  lea    D18(%rip),%rdi
  call   <puts@plt>
  mov    $0x1,%edi
  call   <exit@plt>
  jmp    L300
L161:
  mov    %rsp,%rsi
  lea    0x1200(%rsp),%rdi
  mov    $0x90,%edx
  call   <compare@plt>
  cmp    $0x1,%eax
  je     L431
  mov    %rsp,%rsi
  lea    0x1440(%rsp),%rdi
  mov    $0x90,%edx
  call   <compare@plt>
  cmp    $0x1,%eax
  je     L431
  mov    %rsp,%rsi
  lea    0x1680(%rsp),%rdi
  mov    $0x90,%edx
  call   <compare@plt>
  cmp    $0x1,%eax
  je     L431
  lea    0x240(%rsp),%rsi
  lea    0xfc0(%rsp),%rdi
  mov    $0x90,%edx
  call   <compare@plt>
  mov    %eax,%ebx
  cmp    $0x1,%eax
  je     L431
  lea    0x240(%rsp),%rsi
  lea    0x1200(%rsp),%rdi
  mov    $0x90,%edx
  call   <compare@plt>
  mov    %eax,%ebx
  cmp    $0x1,%eax
  je     L431
  lea    0x240(%rsp),%rsi
  lea    0x1440(%rsp),%rdi
  mov    $0x90,%edx
  call   <compare@plt>
  mov    %eax,%ebx
  cmp    $0x1,%eax
  je     L431
  lea    0x240(%rsp),%rsi
  lea    0x1680(%rsp),%rdi
  mov    $0x90,%edx
  call   <compare@plt>
  mov    %eax,%ebx
  cmp    $0x1,%eax
  je     L431
  lea    0x480(%rsp),%rsi
  lea    0xfc0(%rsp),%rdi
  mov    $0x90,%edx
  call   <compare@plt>
  cmp    $0x1,%eax
  je     L526
  lea    0x480(%rsp),%rsi
  lea    0x1200(%rsp),%rdi
  mov    $0x90,%edx
  call   <compare@plt>
  cmp    $0x1,%eax
  je     L466
  lea    0x480(%rsp),%rsi
  lea    0x1440(%rsp),%rdi
  mov    $0x90,%edx
  call   <compare@plt>
  cmp    $0x1,%eax
  je     L147
  lea    0x480(%rsp),%rsi
  lea    0x1680(%rsp),%rdi
  mov    $0x90,%edx
  call   <compare@plt>
  cmp    $0x1,%eax
  je     L111
  lea    0x6c0(%rsp),%rsi
  lea    0xfc0(%rsp),%rdi
  mov    $0x90,%edx
  call   <compare@plt>
  cmp    $0x1,%eax
  je     L304
  lea    0x6c0(%rsp),%rsi
  lea    0x1200(%rsp),%rdi
  mov    $0x90,%edx
  call   <compare@plt>
  cmp    $0x1,%eax
  je     L443
  lea    0x6c0(%rsp),%rsi
  lea    0x1440(%rsp),%rdi
  mov    $0x90,%edx
  call   <compare@plt>
  cmp    $0x1,%eax
  je     L90
  lea    0x6c0(%rsp),%rsi
  lea    0x1680(%rsp),%rdi
  mov    $0x90,%edx
  call   <compare@plt>
  cmp    $0x1,%eax
  je     L325
  lea    0x900(%rsp),%rsi
  lea    0xfc0(%rsp),%rdi
  mov    $0x90,%edx
  call   <compare@plt>
  cmp    $0x1,%eax
  je     L307
  lea    0x900(%rsp),%rsi
  lea    0x1200(%rsp),%rdi
  mov    $0x90,%edx
  call   <compare@plt>
  cmp    $0x1,%eax
  je     L95
  lea    0x900(%rsp),%rsi
  lea    0x1440(%rsp),%rdi
  mov    $0x90,%edx
  call   <compare@plt>
  cmp    $0x1,%eax
  je     L6
  lea    0x900(%rsp),%rsi
  lea    0x1680(%rsp),%rdi
  mov    $0x90,%edx
  call   <compare@plt>
  cmp    $0x1,%eax
  je     L521
  lea    0xb40(%rsp),%rsi
  lea    0xfc0(%rsp),%rdi
  mov    $0x90,%edx
  call   <compare@plt>
  cmp    $0x1,%eax
  je     L384
  lea    0xb40(%rsp),%rsi
  lea    0x1200(%rsp),%rdi
  mov    $0x90,%edx
  call   <compare@plt>
  cmp    $0x1,%eax
  je     L246
  lea    0xb40(%rsp),%rsi
  lea    0x1440(%rsp),%rdi
  mov    $0x90,%edx
  call   <compare@plt>
  cmp    $0x1,%eax
  je     L329
  lea    0xb40(%rsp),%rsi
  lea    0x1680(%rsp),%rdi
  mov    $0x90,%edx
  call   <compare@plt>
  cmp    $0x1,%eax
  je     L180
  lea    0xd80(%rsp),%rsi
  lea    0xfc0(%rsp),%rdi
  mov    $0x90,%edx
  call   <compare@plt>
  cmp    $0x1,%eax
  je     L177
  lea    0xd80(%rsp),%rsi
  lea    0x1200(%rsp),%rdi
  mov    $0x90,%edx
  call   <compare@plt>
  cmp    $0x1,%eax
  je     L25
  lea    0xd80(%rsp),%rsi
  lea    0x1440(%rsp),%rdi
  mov    $0x90,%edx
  call   <compare@plt>
  cmp    $0x1,%eax
  je     L529
  lea    0xd80(%rsp),%rsi
  lea    0x1680(%rsp),%rdi
  mov    $0x90,%edx
  call   <compare@plt>
  cmp    $0x1,%eax
  setne  %bl
  movzbl %bl,%ebx
  add    $0x6,%ebx
  jmp    L431
L526:
  mov    $0x2,%ebx
  jmp    L431
L466:
  mov    $0x2,%ebx
  jmp    L431
L147:
  mov    $0x2,%ebx
  jmp    L431
L111:
  mov    $0x2,%ebx
  jmp    L431
L304:
  mov    $0x3,%ebx
  jmp    L431
L443:
  mov    $0x3,%ebx
  jmp    L431
L90:
  mov    $0x3,%ebx
  jmp    L431
L325:
  mov    $0x3,%ebx
  jmp    L431
L307:
  mov    $0x4,%ebx
  jmp    L431
L95:
  mov    $0x4,%ebx
  jmp    L431
L6:
  mov    $0x4,%ebx
  jmp    L431
L521:
  mov    $0x4,%ebx
  jmp    L431
L384:
  mov    $0x5,%ebx
  jmp    L431
L246:
  mov    $0x5,%ebx
  jmp    L431
L329:
  mov    $0x5,%ebx
  jmp    L431
L180:
  mov    $0x5,%ebx
  jmp    L431
L177:
  mov    $0x6,%ebx
  jmp    L431
L25:
  mov    $0x6,%ebx
  jmp    L431
L529:
  mov    $0x6,%ebx
  jmp    L431
L416:
  call   <__stack_chk_fail@plt>
```

tool_calls: name: disassemble_data
arguments: tag: D12
type: string
name: disassemble_data
arguments: tag: D4
type: string
name: disassemble_data
arguments: tag: D23
type: string
name: disassemble_data
arguments: tag: D18
type: string

tool: D12: Icon Match:

tool: D4: The matching reference icon is %d


tool: D23: usage: P1-4 valuefile

tool: D18: valuefiles does not contain enough data

assistant: ```c
int main(int argc, char *argv[]) {
  int Icons[1728];
  int Length, Match;
  if (argc != 2) {
    printf("usage: P1-4 valuefile\n");
    exit(1);
  }
  Length = Load_Mem(*++argv, Icons);
  if (Length != 1728) {
    printf("valuefiles does not contain enough data\n");
    exit(1);
  }
  int Icon_0[144], Icon_1[144], Icon_2[144], Icon_3[144], Icon_4[144], Icon_5[144], Icon_6[144], Icon_7[144];
  int Icon_A[144], Icon_B[144], Icon_C[144], Icon_D[144];
  int K;
  for (K = 0; K < 144; K++) {
    Icon_0[K] = Icons[K];
    Icon_1[K] = Icons[K + 144];
    Icon_2[K] = Icons[K + (144 * 2)];
    Icon_3[K] = Icons[K + (144 * 3)];
    Icon_4[K] = Icons[K + (144 * 4)];
    Icon_5[K] = Icons[K + (144 * 5)];
    Icon_6[K] = Icons[K + (144 * 6)];
    Icon_7[K] = Icons[K + (144 * 7)];
    Icon_A[K] = Icons[K + (144 * 8)];
    Icon_B[K] = Icons[K + (144 * 9)];
    Icon_C[K] = Icons[K + (144 * 10)];
    Icon_D[K] = Icons[K + (144 * 11)];
  }
  if (compare(Icon_A, Icon_0, 144) == 1 || compare(Icon_B, Icon_0, 144) == 1 || compare(Icon_C, Icon_0, 144) == 1 || compare(Icon_D, Icon_0, 144) == 1)
    Match = 0;
  else if (compare(Icon_A, Icon_1, 144) == 1 || compare(Icon_B, Icon_1, 144) == 1 || compare(Icon_C, Icon_1, 144) == 1 || compare(Icon_D, Icon_1, 144) == 1)
    Match = 1;
  else if (compare(Icon_A, Icon_2, 144) == 1 || compare(Icon_B, Icon_2, 144) == 1 || compare(Icon_C, Icon_2, 144) == 1 || compare(Icon_D, Icon_2, 144) == 1)
    Match = 2;
  else if (compare(Icon_A, Icon_3, 144) == 1 || compare(Icon_B, Icon_3, 144) == 1 || compare(Icon_C, Icon_3, 144) == 1 || compare(Icon_D, Icon_3, 144) == 1)
    Match = 3;
  else if (compare(Icon_A, Icon_4, 144) == 1 || compare(Icon_B, Icon_4, 144) == 1 || compare(Icon_C, Icon_4, 144) == 1 || compare(Icon_D, Icon_4, 144) == 1)
    Match = 4;
  else if (compare(Icon_A, Icon_5, 144) == 1 || compare(Icon_B, Icon_5, 144) == 1 || compare(Icon_C, Icon_5, 144) == 1 || compare(Icon_D, Icon_5, 144) == 1)
    Match = 5;
  else if (compare(Icon_A, Icon_6, 144) == 1 || compare(Icon_B, Icon_6, 144) == 1 || compare(Icon_C, Icon_6, 144) == 1 || compare(Icon_D, Icon_6, 144) == 1)
    Match = 6;
  else
    Match = 7;
  printf("Icon Match:\n");
  printf("The matching reference icon is %d\n", Match);
  return Match;
}
```