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

```asm
<wireworld>:
  endbr64
  push   %r15
  push   %r14
  push   %r13
  push   %r12
  mov    %edx,%r12d
  push   %rbp
  mov    %esi,%ebp
  push   %rbx
  mov    %rdi,%rbx
  sub    $0x18,%rsp
  mov    %rdi,0x8(%rsp)
  call   <copy_world@plt>
  mov    %rax,(%rsp)
  test   %r12d,%r12d
  jle    L266
  mov    %rax,%r9
  mov    %rbx,%r11
  lea    -0x1(%r12),%r14d
  xor    %r10d,%r10d
  lea    -0x1(%rbp),%r13d
  nopl   0x0(%rax,%rax,1)
L158:
  test   %ebp,%ebp
  jle    L29
  mov    (%r11),%r8
  mov    $0xfffffffffffffffc,%rsi
  mov    $0x4,%eax
  xor    %edx,%edx
  jmp    L3
  nop
L44:
  mov    (%r9),%rcx
  movl   $0x0,-0x4(%rcx,%rax,1)
L207:
  add    $0x1,%edx
  add    $0x4,%rax
  add    $0x4,%rsi
  cmp    %edx,%ebp
  je     L29
L3:
  mov    -0x4(%r8,%rax,1),%ecx
  lea    -0x4(%rax),%rdi
  test   %ecx,%ecx
  je     L44
  cmp    $0x1,%ecx
  je     L255
  cmp    $0x2,%ecx
  je     L214
  cmp    $0x3,%ecx
  jne    L207
  mov    (%r9),%rcx
  add    $0x1,%edx
  add    $0x4,%rax
  add    $0x4,%rsi
  movl   $0x1,(%rcx,%rdi,1)
  cmp    %edx,%ebp
  jne    L3
  nopl   0x0(%rax,%rax,1)
L29:
  add    $0x1,%r10d
  add    $0x8,%r9
  add    $0x8,%r11
  cmp    %r10d,%r12d
  jne    L158
L266:
  mov    0x8(%rsp),%rdi
  mov    %r12d,%edx
  mov    %ebp,%esi
  call   <free_world@plt>
  mov    (%rsp),%rax
  add    $0x18,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
  nop
L255:
  test   %r10d,%r10d
  jle    L131
  test   %edx,%edx
  jle    L131
  mov    -0x8(%r11),%rbx
  xor    %ecx,%ecx
  cmpl   $0x2,(%rbx,%rsi,1)
  sete   %cl
L85:
  xor    %r15d,%r15d
  cmpl   $0x2,(%rbx,%rdi,1)
  sete   %r15b
  add    %r15d,%ecx
  cmp    %r13d,%edx
  jge    L189
  cmpl   $0x2,(%rbx,%rax,1)
  sete   %bl
  movzbl %bl,%ebx
  add    %ebx,%ecx
  test   %edx,%edx
  je     L271
  cmpl   $0x2,-0x8(%r8,%rax,1)
  je     L146
L271:
  xor    %ebx,%ebx
  cmpl   $0x2,(%r8,%rax,1)
  sete   %bl
  add    %ebx,%ecx
L166:
  cmp    %r10d,%r14d
  jle    L259
  mov    0x8(%r11),%rbx
  test   %edx,%edx
  je     L70
  xor    %r15d,%r15d
  cmpl   $0x2,(%rbx,%rsi,1)
  sete   %r15b
  add    %r15d,%ecx
L70:
  xor    %r15d,%r15d
  cmpl   $0x2,(%rbx,%rdi,1)
  sete   %r15b
  add    %r15d,%ecx
  cmp    %edx,%r13d
  jle    L259
  cmpl   $0x2,(%rbx,%rax,1)
  sete   %bl
  movzbl %bl,%ebx
  add    %ebx,%ecx
L259:
  sub    $0x1,%ecx
  cmp    $0x1,%ecx
  ja     L207
  mov    (%r9),%rcx
  movl   $0x2,(%rcx,%rdi,1)
  jmp    L207
  nopw   0x0(%rax,%rax,1)
L131:
  xor    %ecx,%ecx
  test   %r10d,%r10d
  jne    L246
L189:
  test   %edx,%edx
  je     L137
  cmpl   $0x2,-0x8(%r8,%rax,1)
  je     L146
L137:
  cmp    %edx,%r13d
  jle    L166
  jmp    L271
  nopl   (%rax)
L214:
  mov    (%r9),%rcx
  movl   $0x3,(%rcx,%rdi,1)
  jmp    L207
  nopw   0x0(%rax,%rax,1)
L246:
  mov    -0x8(%r11),%rbx
  jmp    L85
  nopl   0x0(%rax)
L146:
  add    $0x1,%ecx
  jmp    L137
```

assistant: ```c
int **wireworld(int **world, int SIZE_X, int SIZE_Y) {
  int **newWorld = copy_world(world, SIZE_X, SIZE_Y);
  int i;
  int j;
  for (i = 0; i < SIZE_Y; i++) {
    for (j = 0; j < SIZE_X; j++) {
      if (world[i][j] == 0)
        newWorld[i][j] = 0;
      else if (world[i][j] == 1) {
        int sum = 0;
        if (i > 0 && j > 0 && world[i - 1][j - 1] == 2)
          sum++;
        if (i > 0 && world[i - 1][j] == 2)
          sum++;
        if (i > 0 && j < SIZE_X - 1 && world[i - 1][j + 1] == 2)
          sum++;
        if (j > 0 && world[i][j - 1] == 2)
          sum++;
        if (j < SIZE_X - 1 && world[i][j + 1] == 2)
          sum++;
        if (i < SIZE_Y - 1 && j > 0 && world[i + 1][j - 1] == 2)
          sum++;
        if (i < SIZE_Y - 1 && world[i + 1][j] == 2)
          sum++;
        if (i < SIZE_Y - 1 && j < SIZE_X - 1 && world[i + 1][j + 1] == 2)
          sum++;
        if (sum == 1 || sum == 2)
          newWorld[i][j] = 2;
      } else if (world[i][j] == 2)
        newWorld[i][j] = 3;
      else if (world[i][j] == 3)
        newWorld[i][j] = 1;
    }
  }
  free_world(world, SIZE_X, SIZE_Y);
  return newWorld;
}
```