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

```asm
<gameOfLife>:
  endbr64
  push   %r15
  mov    %edx,%r11d
  movabs $0xffffffff00000001,%rdx
  push   %r14
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  mov    %rdi,%rbx
  movabs $0x100000001,%rdi
  sub    $0x58,%rsp
  mov    %fs:0x28,%rax
  mov    %rax,0x48(%rsp)
  xor    %eax,%eax
  mov    $0xffffffff,%eax
  mov    %rdi,0x18(%rsp)
  mov    %rax,0x8(%rsp)
  add    $0x1,%rax
  movl   $0xffffffff,0x4(%rsp)
  mov    %rax,0x10(%rsp)
  movl   $0x0,0x24(%rsp)
  mov    %rdx,0x28(%rsp)
  mov    %rdx,0x30(%rsp)
  mov    %rax,0x38(%rsp)
  test   %esi,%esi
  je     L86
  test   %r11d,%r11d
  je     L86
  mov    %esi,%r9d
  lea    -0x1(%rsi),%r15d
  mov    %esi,%r14d
  xor    %r13d,%r13d
  movslq %r11d,%r12
  test   %esi,%esi
  jle    L86
  nopl   0x0(%rax)
L110:
  mov    %r13d,%esi
  test   %r11d,%r11d
  jle    L112
  mov    (%rbx,%r13,8),%rbp
  xor    %r10d,%r10d
  nopl   0x0(%rax,%rax,1)
L136:
  mov    %r10d,%edi
  xor    %edx,%edx
  mov    $0xffffffff,%ecx
  mov    $0xffffffff,%eax
  xor    %r8d,%r8d
  jmp    L77
  nopl   0x0(%rax)
L129:
  mov    (%rsp,%rdx,1),%eax
  mov    0x20(%rsp,%rdx,1),%ecx
L77:
  add    %esi,%eax
  js     L135
  cmp    %eax,%r9d
  jle    L135
  add    %edi,%ecx
  js     L135
  cmp    %ecx,%r11d
  jle    L135
  cltq
  movslq %ecx,%rcx
  mov    (%rbx,%rax,8),%rax
  mov    (%rax,%rcx,4),%eax
  sub    $0x1,%eax
  cmp    $0x2,%eax
  adc    $0x0,%r8d
L135:
  add    $0x4,%rdx
  cmp    $0x20,%rdx
  jne    L129
  mov    0x0(%rbp,%r10,4),%eax
  test   %eax,%eax
  je     L52
  sub    $0x2,%r8d
  cmp    $0x1,%r8d
  jbe    L92
  movl   $0x2,0x0(%rbp,%r10,4)
L92:
  add    $0x1,%r10
  cmp    %r12,%r10
  jne    L136
L112:
  add    $0x1,%r13
  cmp    %r14,%r13
  jne    L110
  mov    %r11d,%edi
  lea    0x8(%rbx,%r15,8),%r8
  shl    $0x2,%rdi
  nopl   0x0(%rax,%rax,1)
L105:
  test   %r11d,%r11d
  jle    L114
  mov    (%rbx),%rdx
  lea    (%rdi,%rdx,1),%rsi
  nopl   0x0(%rax)
L195:
  mov    (%rdx),%eax
  add    $0x4,%rdx
  mov    %eax,%ecx
  shr    $0x1f,%ecx
  add    %ecx,%eax
  and    $0x1,%eax
  sub    %ecx,%eax
  mov    %eax,-0x4(%rdx)
  cmp    %rdx,%rsi
  jne    L195
L114:
  add    $0x8,%rbx
  cmp    %rbx,%r8
  jne    L105
L86:
  mov    0x48(%rsp),%rax
  sub    %fs:0x28,%rax
  jne    L171
  add    $0x58,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
  nopw   0x0(%rax,%rax,1)
L52:
  cmp    $0x3,%r8d
  jne    L92
  movl   $0x3,0x0(%rbp,%r10,4)
  jmp    L92
L171:
  call   <__stack_chk_fail@plt>
```

assistant: ```c
void gameOfLife(int **board, int boardRowSize, int boardColSize) {
  int r, c, i, x, y, count;
  int r_range[] = {-1, -1, -1, 0, 0, 1, 1, 1};
  int c_range[] = {-1, 0, 1, -1, 1, -1, 0, 1};
  if (!(boardRowSize && boardColSize))
    return;
  for (r = 0; r < boardRowSize; ++r) {
    for (c = 0; c < boardColSize; ++c) {
      count = 0;
      for (i = 0; i < 8; ++i) {
        x = r + r_range[i];
        y = c + c_range[i];
        if (x >= 0 && x < boardRowSize && y >= 0 && y < boardColSize && (board[x][y] == 1 || board[x][y] == 2))
          ++count;
      }
      if (board[r][c] && (count < 2 || count > 3))
        board[r][c] = 2;
      else if (count == 3 && !board[r][c])
        board[r][c] = 3;
    }
  }
  for (r = 0; r < boardRowSize; ++r) {
    for (c = 0; c < boardColSize; ++c)
      board[r][c] %= 2;
  }
}
```