user: 这段汇编代码用C语言表示是什么样的?

```asm
<vscan>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x60,%rsp
  mov    %rdi,-0x38(%rbp)
  mov    %rsi,-0x40(%rbp)
  mov    %rdx,-0x48(%rbp)
  mov    %rcx,-0x50(%rbp)
  mov    %r8d,-0x54(%rbp)
  mov    %r9d,-0x58(%rbp)
  movl   $0x0,-0x20(%rbp)
  mov    -0x58(%rbp),%eax
  mov    %eax,-0x1c(%rbp)
  mov    0x28(%rbp),%eax
  sub    $0x1,%eax
  mov    %eax,-0x18(%rbp)
  cmpl   $0x0,-0x18(%rbp)
  js     L118
  mov    0x50(%rbp),%eax
  add    $0x1,%eax
  mov    %eax,-0x14(%rbp)
  movl   $0x0,-0x28(%rbp)
  mov    0x38(%rbp),%eax
  sub    -0x58(%rbp),%eax
  mov    %eax,%edx
  mov    -0x14(%rbp),%eax
  sub    -0x54(%rbp),%eax
  mov    %edx,%ecx
  imul   %eax,%ecx
  mov    -0x58(%rbp),%eax
  sub    0x58(%rbp),%eax
  mov    %eax,%edx
  mov    0x30(%rbp),%eax
  sub    -0x54(%rbp),%eax
  imul   %edx,%eax
  add    %ecx,%eax
  lea    (%rax,%rax,1),%ecx
  mov    0x30(%rbp),%eax
  sub    -0x54(%rbp),%eax
  mov    %eax,%esi
  mov    %ecx,%eax
  cltd
  idiv   %esi
  test   %eax,%eax
  jle    L84
  movl   $0x1,-0x28(%rbp)
L84:
  mov    0x58(%rbp),%edx
  mov    -0x28(%rbp),%eax
  add    %edx,%eax
  mov    %eax,-0x10(%rbp)
  movl   $0x0,-0x24(%rbp)
  mov    0x48(%rbp),%eax
  sub    -0x58(%rbp),%eax
  mov    %eax,%edx
  mov    -0x14(%rbp),%eax
  sub    -0x54(%rbp),%eax
  mov    %edx,%ecx
  imul   %eax,%ecx
  mov    -0x58(%rbp),%eax
  sub    0x60(%rbp),%eax
  mov    %eax,%edx
  mov    0x40(%rbp),%eax
  sub    -0x54(%rbp),%eax
  imul   %edx,%eax
  add    %ecx,%eax
  lea    (%rax,%rax,1),%ecx
  mov    0x40(%rbp),%eax
  sub    -0x54(%rbp),%eax
  mov    %eax,%esi
  mov    %ecx,%eax
  cltd
  idiv   %esi
  test   %eax,%eax
  jle    L31
  movl   $0x1,-0x24(%rbp)
L31:
  mov    0x60(%rbp),%edx
  mov    -0x24(%rbp),%eax
  add    %edx,%eax
  mov    %eax,-0xc(%rbp)
  mov    -0x10(%rbp),%eax
  sub    -0x58(%rbp),%eax
  mov    %eax,%edx
  mov    -0x14(%rbp),%eax
  sub    -0x54(%rbp),%eax
  mov    -0x48(%rbp),%rcx
  mov    %edx,%esi
  mov    %eax,%edi
  call   *%rcx
  mov    -0x54(%rbp),%edx
  add    %edx,%eax
  mov    %eax,-0x8(%rbp)
  mov    -0x10(%rbp),%eax
  sub    -0x58(%rbp),%eax
  mov    %eax,%edx
  mov    -0x14(%rbp),%eax
  sub    -0x54(%rbp),%eax
  mov    -0x50(%rbp),%rcx
  mov    %edx,%esi
  mov    %eax,%edi
  call   *%rcx
  mov    -0x58(%rbp),%edx
  add    %edx,%eax
  mov    %eax,-0x4(%rbp)
  mov    -0x4(%rbp),%ecx
  mov    -0x8(%rbp),%edx
  mov    -0x40(%rbp),%rsi
  mov    -0x38(%rbp),%rax
  mov    0x10(%rbp),%r8d
  mov    %rax,%rdi
  call   <vcheck@plt>
  test   %rax,%rax
  je     L58
  movl   $0x1,-0x20(%rbp)
  mov    -0x10(%rbp),%eax
  mov    %eax,-0x1c(%rbp)
L58:
  mov    -0x10(%rbp),%eax
  mov    %eax,-0x2c(%rbp)
  jmp    L54
L55:
  mov    -0x2c(%rbp),%eax
  sub    -0x58(%rbp),%eax
  mov    %eax,%edx
  mov    -0x14(%rbp),%eax
  sub    -0x54(%rbp),%eax
  mov    -0x48(%rbp),%rcx
  mov    %edx,%esi
  mov    %eax,%edi
  call   *%rcx
  mov    -0x54(%rbp),%edx
  add    %edx,%eax
  mov    %eax,-0x8(%rbp)
  mov    -0x2c(%rbp),%eax
  sub    -0x58(%rbp),%eax
  mov    %eax,%edx
  mov    -0x14(%rbp),%eax
  sub    -0x54(%rbp),%eax
  mov    -0x50(%rbp),%rcx
  mov    %edx,%esi
  mov    %eax,%edi
  call   *%rcx
  mov    -0x58(%rbp),%edx
  add    %edx,%eax
  mov    %eax,-0x4(%rbp)
  mov    -0x4(%rbp),%ecx
  mov    -0x8(%rbp),%edx
  mov    -0x40(%rbp),%rsi
  mov    -0x38(%rbp),%rax
  mov    0x10(%rbp),%r8d
  mov    %rax,%rdi
  call   <vcheck@plt>
  test   %rax,%rax
  je     L104
  mov    0x18(%rbp),%r8d
  mov    -0x4(%rbp),%ecx
  mov    -0x8(%rbp),%edx
  mov    -0x40(%rbp),%rsi
  mov    -0x38(%rbp),%rax
  push   $0x1
  mov    0x20(%rbp),%edi
  push   %rdi
  mov    %r8d,%r9d
  mov    0x10(%rbp),%r8d
  mov    %rax,%rdi
  call   <vmark_xynb@plt>
  add    $0x10,%rsp
  cmpl   $0x0,-0x20(%rbp)
  je     L120
  mov    -0x2c(%rbp),%eax
  cmp    -0xc(%rbp),%eax
  jne    L46
  mov    -0x58(%rbp),%r9d
  mov    -0x54(%rbp),%r8d
  mov    -0x50(%rbp),%rcx
  mov    -0x48(%rbp),%rdx
  mov    -0x40(%rbp),%rsi
  mov    -0x38(%rbp),%rax
  sub    $0x8,%rsp
  mov    -0x2c(%rbp),%edi
  push   %rdi
  mov    -0x1c(%rbp),%edi
  push   %rdi
  mov    -0x14(%rbp),%edi
  push   %rdi
  mov    0x48(%rbp),%edi
  push   %rdi
  mov    0x40(%rbp),%edi
  push   %rdi
  mov    0x38(%rbp),%edi
  push   %rdi
  mov    0x30(%rbp),%edi
  push   %rdi
  mov    -0x18(%rbp),%edi
  push   %rdi
  mov    0x20(%rbp),%edi
  push   %rdi
  mov    0x18(%rbp),%edi
  push   %rdi
  mov    0x10(%rbp),%edi
  push   %rdi
  mov    %rax,%rdi
  call   <vscan>
  add    $0x60,%rsp
  jmp    L46
L120:
  mov    -0x14(%rbp),%eax
  mov    %eax,0x30(%rbp)
  mov    -0x2c(%rbp),%eax
  mov    %eax,0x38(%rbp)
  movl   $0x1,-0x20(%rbp)
  mov    -0x2c(%rbp),%eax
  mov    %eax,-0x1c(%rbp)
  jmp    L46
L104:
  mov    -0x2c(%rbp),%eax
  sub    -0x58(%rbp),%eax
  mov    %eax,%edx
  mov    -0x14(%rbp),%eax
  sub    -0x54(%rbp),%eax
  mov    -0x48(%rbp),%rcx
  mov    %edx,%esi
  mov    %eax,%edi
  call   *%rcx
  mov    -0x54(%rbp),%edx
  add    %edx,%eax
  mov    %eax,-0x8(%rbp)
  mov    -0x2c(%rbp),%eax
  sub    -0x58(%rbp),%eax
  mov    %eax,%edx
  mov    -0x14(%rbp),%eax
  sub    -0x54(%rbp),%eax
  mov    -0x50(%rbp),%rcx
  mov    %edx,%esi
  mov    %eax,%edi
  call   *%rcx
  mov    -0x58(%rbp),%edx
  add    %edx,%eax
  mov    %eax,-0x4(%rbp)
  mov    -0x4(%rbp),%ecx
  mov    -0x8(%rbp),%edx
  mov    -0x40(%rbp),%rsi
  mov    -0x38(%rbp),%rax
  mov    $0x1,%r9d
  mov    0x10(%rbp),%r8d
  mov    %rax,%rdi
  call   <vmark_safe@plt>
  cmpl   $0x0,-0x20(%rbp)
  je     L14
  mov    -0x2c(%rbp),%eax
  lea    -0x1(%rax),%edi
  mov    -0x2c(%rbp),%eax
  lea    -0x1(%rax),%r8d
  mov    -0x58(%rbp),%r9d
  mov    -0x54(%rbp),%r10d
  mov    -0x50(%rbp),%rcx
  mov    -0x48(%rbp),%rdx
  mov    -0x40(%rbp),%rsi
  mov    -0x38(%rbp),%rax
  sub    $0x8,%rsp
  push   %rdi
  mov    -0x1c(%rbp),%edi
  push   %rdi
  mov    -0x14(%rbp),%edi
  push   %rdi
  push   %r8
  mov    -0x14(%rbp),%edi
  push   %rdi
  mov    0x38(%rbp),%edi
  push   %rdi
  mov    0x30(%rbp),%edi
  push   %rdi
  mov    -0x18(%rbp),%edi
  push   %rdi
  mov    0x20(%rbp),%edi
  push   %rdi
  mov    0x18(%rbp),%edi
  push   %rdi
  mov    0x10(%rbp),%edi
  push   %rdi
  mov    %r10d,%r8d
  mov    %rax,%rdi
  call   <vscan>
  add    $0x60,%rsp
  mov    -0x14(%rbp),%eax
  mov    %eax,0x30(%rbp)
  mov    -0x2c(%rbp),%eax
  add    $0x1,%eax
  mov    %eax,0x38(%rbp)
  movl   $0x0,-0x20(%rbp)
  jmp    L46
L14:
  mov    -0x14(%rbp),%eax
  mov    %eax,0x30(%rbp)
  mov    -0x2c(%rbp),%eax
  add    $0x1,%eax
  mov    %eax,0x38(%rbp)
  movl   $0x0,-0x20(%rbp)
L46:
  addl   $0x1,-0x2c(%rbp)
L54:
  mov    -0x2c(%rbp),%eax
  cmp    -0xc(%rbp),%eax
  jle    L55
L118:
  nop
  leave
  ret
```

assistant: ```c
void vscan(struct grid *g, struct vision *v, int (*trans_x)(int, int), int (*trans_y)(int, int), int x0, int y0, int z0, int zminus, int zplus, int range, int xfl, int yfl, int xfh, int yfh, int prev_x, int prev_yl, int prev_yh) {
  int x, y, dyl, dyh, yl, yh;
  int b_lower = 0;
  int lower = y0;
  int range_u = range - 1;
  int xx, yy;
  if (range_u >= 0) {
    x = prev_x + 1;
    dyl = 0;
    if (2 * ((yfl - y0) * (x - x0) + (y0 - prev_yl) * (xfl - x0)) / (xfl - x0) >= 1) {
      dyl = 1;
    }
    yl = prev_yl + dyl;
    dyh = 0;
    if (2 * ((yfh - y0) * (x - x0) + (y0 - prev_yh) * (xfh - x0)) / (xfh - x0) >= 1) {
      dyh = 1;
    }
    yh = prev_yh + dyh;
    xx = x0 + trans_x(x - x0, yl - y0);
    yy = y0 + trans_y(x - x0, yl - y0);
    if (vcheck(g, v, xx, yy, z0)) {
      b_lower = 1;
      lower = yl;
    }
    for (y = yl; y <= yh; ++y) {
      xx = x0 + trans_x(x - x0, y - y0);
      yy = y0 + trans_y(x - x0, y - y0);
      if (vcheck(g, v, xx, yy, z0)) {
        vmark_xynb(g, v, xx, yy, z0, zminus, zplus, 1);
        if (b_lower) {
          if (y == yh) {
            vscan(g, v, trans_x, trans_y, x0, y0, z0, zminus, zplus, range_u, xfl, yfl, xfh, yfh, x, lower, y);
          } else {
            ;
          }
        } else {
          xfl = x;
          yfl = y;
          b_lower = 1;
          lower = y;
        }
      } else {
        xx = x0 + trans_x(x - x0, y - y0);
        yy = y0 + trans_y(x - x0, y - y0);
        vmark_safe(g, v, xx, yy, z0, 1);
        if (b_lower) {
          vscan(g, v, trans_x, trans_y, x0, y0, z0, zminus, zplus, range_u, xfl, yfl, x, y - 1, x, lower, y - 1);
          xfl = x;
          yfl = y + 1;
          b_lower = 0;
        } else {
          xfl = x;
          yfl = y + 1;
          b_lower = 0;
        }
      }
    }
  }
}
```