user: 请将这段汇编代码片段转换成等效的C代码：

```asm
<dfs>:
  endbr64
  push   %r15
  movslq %ecx,%rax
  push   %r14
  push   %r13
  mov    %rdx,%r13
  movslq %r8d,%rdx
  push   %r12
  mov    %rax,%r12
  push   %rbp
  mov    %rdi,%rbp
  push   %rbx
  sub    $0x28,%rsp
  mov    (%rsi,%rax,8),%rcx
  movzbl (%rdi),%edi
  xor    %eax,%eax
  cmp    %dil,(%rcx,%rdx,1)
  jne    L100
  mov    0x60(%rsp),%r14d
  mov    %rdx,%rbx
  mov    $0x1,%eax
  imul   %r12d,%r14d
  lea    (%r14,%rdx,1),%r15d
  movslq %r15d,%r15
  shl    $0x2,%r15
  lea    0x0(%r13,%r15,1),%r11
  movl   $0x1,(%r11)
  cmpb   $0x0,0x1(%rbp)
  je     L100
  test   %r12d,%r12d
  jle    L105
  mov    %r14d,%eax
  sub    0x60(%rsp),%eax
  lea    -0x1(%r12),%ecx
  add    %edx,%eax
  cltq
  mov    0x0(%r13,%rax,4),%edi
  test   %edi,%edi
  jne    L105
  mov    %r11,0x18(%rsp)
  sub    $0x8,%rsp
  mov    %edx,%r8d
  lea    0x1(%rbp),%rdi
  mov    0x68(%rsp),%eax
  mov    %r13,%rdx
  push   %rax
  mov    %r9d,0x20(%rsp)
  mov    %rsi,0x18(%rsp)
  call   <dfs>
  pop    %rdx
  pop    %rcx
  test   %eax,%eax
  mov    0x8(%rsp),%rsi
  mov    0x10(%rsp),%r9d
  mov    0x18(%rsp),%r11
  jne    L32
  nopl   0x0(%rax)
L105:
  lea    -0x1(%r9),%eax
  cmp    %r12d,%eax
  jle    L111
  mov    0x60(%rsp),%r10d
  lea    0x1(%r12),%ecx
  add    %r14d,%r10d
  add    %ebx,%r10d
  movslq %r10d,%r10
  mov    0x0(%r13,%r10,4),%r14d
  test   %r14d,%r14d
  je     L85
L111:
  test   %ebx,%ebx
  jle    L78
L122:
  mov    -0x4(%r13,%r15,1),%eax
  test   %eax,%eax
  jne    L78
  mov    %r11,0x18(%rsp)
  sub    $0x8,%rsp
  lea    -0x1(%rbx),%r8d
  mov    %r12d,%ecx
  mov    0x68(%rsp),%eax
  lea    0x1(%rbp),%rdi
  mov    %r13,%rdx
  push   %rax
  mov    %rsi,0x18(%rsp)
  mov    %r9d,0x20(%rsp)
  call   <dfs>
  pop    %r8
  pop    %r9
  mov    0x18(%rsp),%r11
  mov    0x10(%rsp),%r9d
  mov    0x8(%rsp),%rsi
L39:
  test   %eax,%eax
  je     L78
  nopl   0x0(%rax)
L32:
  movl   $0x0,(%r11)
L100:
  add    $0x28,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
  xchg   %ax,%ax
L78:
  mov    0x60(%rsp),%eax
  sub    $0x1,%eax
  cmp    %ebx,%eax
  mov    $0x0,%eax
  jle    L32
  mov    0x4(%r13,%r15,1),%edi
  test   %edi,%edi
  jne    L32
  mov    %r11,0x8(%rsp)
  sub    $0x8,%rsp
  mov    %r12d,%ecx
  mov    %r13,%rdx
  mov    0x68(%rsp),%eax
  lea    0x1(%rbp),%rdi
  lea    0x1(%rbx),%r8d
  push   %rax
  call   <dfs>
  pop    %rdx
  pop    %rcx
  mov    0x8(%rsp),%r11
  jmp    L32
  nopl   0x0(%rax,%rax,1)
L85:
  mov    %r11,0x8(%rsp)
  sub    $0x8,%rsp
  lea    0x1(%rbp),%rdi
  mov    %ebx,%r8d
  mov    0x68(%rsp),%eax
  mov    %r13,%rdx
  push   %rax
  mov    %r9d,0x28(%rsp)
  mov    %rsi,0x20(%rsp)
  call   <dfs>
  pop    %r10
  pop    %r11
  test   %eax,%eax
  mov    0x8(%rsp),%r11
  jne    L32
  test   %ebx,%ebx
  mov    0x10(%rsp),%rsi
  mov    0x18(%rsp),%r9d
  jg     L122
  jmp    L39
```

assistant: ```c
bool dfs(char *word, char **board, bool *used, int row, int col, int row_size, int col_size) {
  if (board[row][col] != *word) {
    return false;
  }
  used[row * col_size + col] = true;
  if (*(word + 1) == '\0') {
    return true;
  }
  bool result = false;
  if (row > 0 && !used[(row - 1) * col_size + col]) {
    result = dfs(word + 1, board, used, row - 1, col, row_size, col_size);
  }
  if (!result && row < row_size - 1 && !used[(row + 1) * col_size + col]) {
    result = dfs(word + 1, board, used, row + 1, col, row_size, col_size);
  }
  if (!result && col > 0 && !used[row * col_size + col - 1]) {
    result = dfs(word + 1, board, used, row, col - 1, row_size, col_size);
  }
  if (!result && col < col_size - 1 && !used[row * col_size + col + 1]) {
    result = dfs(word + 1, board, used, row, col + 1, row_size, col_size);
  }
  used[row * col_size + col] = false;
  return result;
}
```