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

```asm
<elimination_step>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x30,%rsp
  mov    %edi,-0x24(%rbp)
  mov    %esi,-0x28(%rbp)
  mov    %rdx,-0x30(%rbp)
  mov    -0x28(%rbp),%edx
  mov    -0x24(%rbp),%eax
  mov    %edx,%esi
  mov    %eax,%edi
  call   <new_matrix@plt>
  mov    %rax,-0x10(%rbp)
  mov    -0x28(%rbp),%edx
  mov    -0x24(%rbp),%eax
  mov    %edx,%esi
  mov    %eax,%edi
  call   <new_matrix@plt>
  mov    %rax,-0x8(%rbp)
  movl   $0x0,-0x1c(%rbp)
  jmp    L44
L153:
  movl   $0x0,-0x18(%rbp)
  jmp    L128
L50:
  mov    -0x1c(%rbp),%eax
  lea    0x0(,%rax,8),%rdx
  mov    -0x8(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%rdx
  mov    -0x18(%rbp),%eax
  add    %rdx,%rax
  movb   $0x0,(%rax)
  addl   $0x1,-0x18(%rbp)
L128:
  mov    -0x18(%rbp),%eax
  cmp    -0x28(%rbp),%eax
  jb     L50
  addl   $0x1,-0x1c(%rbp)
L44:
  mov    -0x1c(%rbp),%eax
  cmp    -0x24(%rbp),%eax
  jb     L153
  movl   $0x0,-0x1c(%rbp)
  jmp    L162
L135:
  movl   $0x0,-0x18(%rbp)
  jmp    L127
L140:
  mov    -0x1c(%rbp),%eax
  lea    0x0(,%rax,8),%rdx
  mov    -0x30(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%rdx
  mov    -0x18(%rbp),%eax
  add    %rdx,%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  mov    %eax,-0x14(%rbp)
  cmpl   $0x0,-0x14(%rbp)
  je     L148
  mov    -0x30(%rbp),%r8
  mov    -0x28(%rbp),%edi
  mov    -0x24(%rbp),%ecx
  mov    -0x18(%rbp),%edx
  mov    -0x1c(%rbp),%esi
  mov    -0x14(%rbp),%eax
  sub    $0x8,%rsp
  push   -0x10(%rbp)
  mov    %r8,%r9
  mov    %edi,%r8d
  mov    %eax,%edi
  call   <tag_cell@plt>
  add    $0x10,%rsp
  addl   $0x1,-0x18(%rbp)
L127:
  mov    -0x18(%rbp),%eax
  cmp    -0x28(%rbp),%eax
  jb     L140
  jmp    L126
L148:
  nop
L126:
  addl   $0x1,-0x1c(%rbp)
L162:
  mov    -0x1c(%rbp),%eax
  cmp    -0x24(%rbp),%eax
  jb     L135
  movl   $0x0,-0x1c(%rbp)
  jmp    L49
L73:
  movl   $0x0,-0x18(%rbp)
  jmp    L170
L200:
  mov    -0x1c(%rbp),%eax
  lea    0x0(,%rax,8),%rdx
  mov    -0x30(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%rdx
  mov    -0x18(%rbp),%eax
  add    %rdx,%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  mov    %eax,-0x14(%rbp)
  cmpl   $0x0,-0x14(%rbp)
  je     L181
  mov    -0x30(%rbp),%r8
  mov    -0x28(%rbp),%edi
  mov    -0x24(%rbp),%ecx
  mov    -0x18(%rbp),%edx
  mov    -0x1c(%rbp),%esi
  mov    -0x14(%rbp),%eax
  push   -0x8(%rbp)
  push   -0x10(%rbp)
  mov    %r8,%r9
  mov    %edi,%r8d
  mov    %eax,%edi
  call   <mark_delete@plt>
  add    $0x10,%rsp
  addl   $0x1,-0x18(%rbp)
L170:
  mov    -0x18(%rbp),%eax
  cmp    -0x28(%rbp),%eax
  jb     L200
  jmp    L157
L181:
  nop
L157:
  addl   $0x1,-0x1c(%rbp)
L49:
  mov    -0x1c(%rbp),%eax
  cmp    -0x24(%rbp),%eax
  jb     L73
  movl   $0x0,-0x1c(%rbp)
  jmp    L198
L102:
  movl   $0x0,-0x18(%rbp)
  jmp    L25
L59:
  mov    -0x1c(%rbp),%eax
  lea    0x0(,%rax,8),%rdx
  mov    -0x8(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%rdx
  mov    -0x18(%rbp),%eax
  add    %rdx,%rax
  movzbl (%rax),%eax
  test   %al,%al
  je     L133
  mov    -0x1c(%rbp),%eax
  lea    0x0(,%rax,8),%rdx
  mov    -0x30(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%rdx
  mov    -0x18(%rbp),%eax
  add    %rdx,%rax
  movb   $0x0,(%rax)
L133:
  addl   $0x1,-0x18(%rbp)
L25:
  mov    -0x18(%rbp),%eax
  cmp    -0x28(%rbp),%eax
  jb     L59
  addl   $0x1,-0x1c(%rbp)
L198:
  mov    -0x1c(%rbp),%eax
  cmp    -0x24(%rbp),%eax
  jb     L102
  mov    -0x10(%rbp),%rdx
  mov    -0x24(%rbp),%eax
  mov    %rdx,%rsi
  mov    %eax,%edi
  call   <free_matrix@plt>
  mov    -0x8(%rbp),%rax
  leave
  ret
```

assistant: ```c
unsigned char **elimination_step(const unsigned int width, const unsigned int height, unsigned char **const grid) {
  unsigned int i, j;
  unsigned int cell;
  unsigned char **const tag = new_matrix(width, height);
  unsigned char **const record = new_matrix(width, height);
  for (i = 0; i < width; i++) {
    for (j = 0; j < height; j++) {
      record[i][j] = 0;
    }
  }
  for (i = 0; i < width; i++) {
    for (j = 0; j < height; j++) {
      cell = grid[i][j];
      if (cell) {
        tag_cell(cell, i, j, width, height, grid, tag);
      } else {
        break;
      }
    }
  }
  for (i = 0; i < width; i++) {
    for (j = 0; j < height; j++) {
      cell = grid[i][j];
      if (cell) {
        mark_delete(cell, i, j, width, height, grid, tag, record);
      } else {
        break;
      }
    }
  }
  for (i = 0; i < width; i++) {
    for (j = 0; j < height; j++) {
      if (record[i][j]) {
        grid[i][j] = 0;
      }
    }
  }
  free_matrix(width, tag);
  return record;
}
```