user: 请从给定的汇编指令推导出C源代码:

```asm
<run>:
  endbr64
  push   %r15
  mov    $0x32,%ecx
  push   %r14
  push   %r13
  lea    D24(%rip),%r13
  push   %r12
  push   %rbp
  push   %rbx
  lea    D9(%rip),%rbx
  sub    $0x378,%rsp
  mov    %fs:0x28,%rax
  mov    %rax,0x368(%rsp)
  xor    %eax,%eax
  lea    0x40(%rsp),%rdi
  lea    0x3c(%rsp),%r12
  movabs $0x2d2d2d2d2d2d2d2d,%rax
  mov    %rdi,0x28(%rsp)
  lea    0x38(%rsp),%rbp
  rep stos %rax,%es:(%rdi)
  lea    0x1d0(%rsp),%rdi
  mov    $0x32,%ecx
  mov    %rdi,0x8(%rsp)
  rep stos %rax,%es:(%rdi)
  lea    D20(%rip),%rdi
  call   <puts@plt>
  lea    D33(%rip),%rdi
  call   <puts@plt>
  jmp    L71
L184:
  movslq 0x3c(%rsp),%rdx
  cmp    $0x63,%edx
  je     L138
  lea    (%rax,%rax,4),%rax
  lea    0x370(%rsp,%rax,4),%rax
  movb   $0x2a,-0x330(%rdx,%rax,1)
L71:
  mov    %r13,%rdi
  xor    %eax,%eax
  call   <printf@plt>
  mov    %r12,%rdx
  mov    %rbp,%rsi
  mov    %rbx,%rdi
  call   <scanf@plt>
  movslq 0x38(%rsp),%rax
  cmp    $0x63,%eax
  jne    L184
L138:
  lea    0x54(%rsp),%rbp
  lea    0x1e4(%rsp),%rax
  mov    %rbp,0x18(%rsp)
  mov    %rax,0x10(%rsp)
L128:
  lea    -0x14(%rbp),%rbx
L140:
  movsbl (%rbx),%edi
  add    $0x1,%rbx
  call   <putchar@plt>
  cmp    %rbp,%rbx
  jne    L140
  mov    $0xa,%edi
  lea    0x14(%rbx),%rbp
  call   <putchar@plt>
  cmp    0x10(%rsp),%rbp
  jne    L128
  mov    $0xa,%edi
  mov    $0x2d,%r15d
  call   <putchar@plt>
  lea    0x2c(%rsp),%rax
  mov    %rax,0x20(%rsp)
L166:
  mov    0x8(%rsp),%r11
  mov    0x20(%rsp),%r13
  xor    %r10d,%r10d
  xor    %r14d,%r14d
  movl   $0xffffffff,(%rsp)
  nopl   (%rax)
L105:
  lea    0x1(%r14),%eax
  test   %r10d,%r10d
  mov    %r13,%r9
  mov    $0xffffffff,%r8d
  mov    %eax,0x4(%rsp)
  cltq
  setle  %bl
  add    $0x14,%r13
  mov    %rax,%r14
  lea    (%rax,%rax,4),%rax
  lea    0x28(%r9),%rcx
  mov    %r13,%rsi
  lea    0x370(%rsp,%rax,4),%r12
  movslq (%rsp),%rax
  xor    %edx,%edx
  lea    (%rax,%rax,4),%rax
  lea    0x370(%rsp,%rax,4),%rbp
  jmp    L97
  nopw   0x0(%rax,%rax,1)
L185:
  xor    %edi,%edi
  cmpb   $0x2a,(%r9,%rdx,1)
  sete   %dil
  add    %edi,%eax
  xor    %edi,%edi
  cmpb   $0x2a,(%rcx)
  sete   %dil
  add    %edi,%eax
  lea    0x1(%rdx),%edi
  movslq %edi,%rdi
  cmpb   $0x2a,-0x330(%rdi,%rbp,1)
  sete   %dil
  movzbl %dil,%edi
  add    %edi,%eax
L1:
  xor    %edi,%edi
  cmpb   $0x2a,0x1(%rsi)
  sete   %dil
  add    %edi,%eax
  xor    %edi,%edi
  cmpb   $0x2a,0x1(%rcx)
  sete   %dil
  add    %edi,%eax
  mov    $0x2a,%edi
  cmp    $0x3,%eax
  je     L179
  mov    $0x2d,%edi
  cmp    $0x2,%eax
  jne    L179
  movzbl (%rsi),%edi
  cmp    $0x2a,%dil
  cmovne %r15d,%edi
L179:
  mov    %dil,(%r11,%rdx,1)
  add    $0x1,%rdx
  add    $0x1,%rsi
  add    $0x1,%rcx
  add    $0x1,%r8d
  cmp    $0x14,%rdx
  je     L69
L97:
  test   %edx,%edx
  jle    L38
  test   %bl,%bl
  jne    L38
  xor    %eax,%eax
  cmpb   $0x2a,-0x1(%r9,%rdx,1)
  sete   %al
L103:
  xor    %edi,%edi
  cmpb   $0x2a,-0x1(%rsi)
  sete   %dil
  add    %edi,%eax
  movslq %r8d,%rdi
  cmpb   $0x2a,-0x330(%rdi,%r12,1)
  sete   %dil
  movzbl %dil,%edi
  add    %edi,%eax
L65:
  test   %r10d,%r10d
  jne    L185
  xor    %edi,%edi
  cmpb   $0x2a,(%rcx)
  sete   %dil
  add    %edi,%eax
  jmp    L1
  nop
L38:
  xor    %eax,%eax
  test   %rdx,%rdx
  je     L65
  jmp    L103
  nopl   0x0(%rax)
L69:
  addl   $0x1,(%rsp)
  add    $0x1,%r10d
  add    $0x14,%r11
  cmpl   $0x14,0x4(%rsp)
  jne    L105
  mov    0x28(%rsp),%rdi
  mov    0x8(%rsp),%rsi
  mov    $0x32,%ecx
  rep movsq %ds:(%rsi),%es:(%rdi)
  mov    0x18(%rsp),%rbp
  mov    0x10(%rsp),%r12
  nopl   0x0(%rax,%rax,1)
L18:
  lea    -0x14(%rbp),%rbx
  nopl   0x0(%rax)
L174:
  movsbl (%rbx),%edi
  add    $0x1,%rbx
  call   <putchar@plt>
  cmp    %rbx,%rbp
  jne    L174
  mov    $0xa,%edi
  add    $0x14,%rbp
  call   <putchar@plt>
  cmp    %r12,%rbp
  jne    L18
  jmp    L166
```

tool_calls: name: read_data
arguments: data_label: D24
type: string
name: read_data
arguments: data_label: D9
type: string
name: read_data
arguments: data_label: D20
type: string
name: read_data
arguments: data_label: D33
type: string

tool: D24: x, y = 

tool: D9: %d%d

tool: D20: Input default alive cell location.(x,y)

tool: D33: When input number 99, setting is finished.

assistant: ```c
void run() {
  char field[20][20];
  char nfield[20][20];
  int x, y;
  int count;
  int i, j;
  for (i = 0; i < 20; i++) {
    for (j = 0; j < 20; j++) {
      field[i][j] = '-';
      nfield[i][j] = '-';
    }
  }
  printf("Input default alive cell location.(x,y)\n");
  printf("When input number 99, setting is finished.\n");
  while (1) {
    printf("x, y = ");
    scanf("%d%d", &x, &y);
    if (x == 99 || y == 99) {
      break;
    }
    field[x][y] = '*';
  }
  for (i = 0; i < 20; i++) {
    for (j = 0; j < 20; j++) {
      printf("%c", field[i][j]);
    }
    printf("\n");
  }
  printf("\n");
  while (1) {
    for (i = 0; i < 20; i++) {
      for (j = 0; j < 20; j++) {
        count = 0;
        if ((i - 1 < 0) || (j - 1 < 0)) {
          ;
        } else if (field[i - 1][j - 1] == '*') {
          count++;
        }
        if (j - 1 < 0) {
          ;
        } else if (field[i][j - 1] == '*') {
          count++;
        }
        if ((i + 1 > 20) || (j - 1 < 0)) {
          ;
        } else if (field[i + 1][j - 1] == '*') {
          count++;
        }
        if (i - 1 < 0) {
          ;
        } else if (field[i - 1][j] == '*') {
          count++;
        }
        if (i + 1 > 20) {
          ;
        } else if (field[i + 1][j] == '*') {
          count++;
        }
        if ((i - 1 < 0) || (j + 1 > 20)) {
          ;
        } else if (field[i - 1][j + 1] == '*') {
          count++;
        }
        if (j + 1 > 20) {
          ;
        } else if (field[i][j + 1] == '*') {
          count++;
        }
        if ((i + 1 > 20) || (j + 1 > 20)) {
          ;
        } else if (field[i + 1][j + 1] == '*') {
          count++;
        }
        if (count == 3) {
          nfield[i][j] = '*';
        } else if (count == 2 && field[i][j] == '*') {
          nfield[i][j] = '*';
        } else {
          nfield[i][j] = '-';
        }
      }
    }
    for (i = 0; i < 20; i++) {
      for (j = 0; j < 20; j++) {
        field[i][j] = nfield[i][j];
      }
    }
    for (i = 0; i < 20; i++) {
      for (j = 0; j < 20; j++) {
        printf("%c", field[i][j]);
      }
      printf("\n");
    }
    for (i = 0; i < 10000; i++) {
      for (j = 0; j < 10000; j++) {
        ;
      }
    }
  }
}
```