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

```asm
<validity>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  mov    %rdi,-0x28(%rbp)
  movl   $0x0,-0x14(%rbp)
  jmp    L400
L171:
  movl   $0x0,-0x18(%rbp)
  jmp    L255
L233:
  movl   $0x8,-0x10(%rbp)
  jmp    L110
L117:
  mov    -0x10(%rbp),%eax
  cmp    -0x18(%rbp),%eax
  je     L384
  mov    -0x10(%rbp),%eax
  movslq %eax,%rdx
  mov    %rdx,%rax
  shl    $0x3,%rax
  add    %rdx,%rax
  shl    $0x2,%rax
  mov    %rax,%rdx
  mov    -0x28(%rbp),%rax
  add    %rax,%rdx
  mov    -0x14(%rbp),%eax
  cltq
  mov    (%rdx,%rax,4),%ecx
  mov    -0x18(%rbp),%eax
  movslq %eax,%rdx
  mov    %rdx,%rax
  shl    $0x3,%rax
  add    %rdx,%rax
  shl    $0x2,%rax
  mov    %rax,%rdx
  mov    -0x28(%rbp),%rax
  add    %rax,%rdx
  mov    -0x14(%rbp),%eax
  cltq
  mov    (%rdx,%rax,4),%eax
  cmp    %eax,%ecx
  jne    L384
  mov    -0x10(%rbp),%eax
  movslq %eax,%rdx
  mov    %rdx,%rax
  shl    $0x3,%rax
  add    %rdx,%rax
  shl    $0x2,%rax
  mov    %rax,%rdx
  mov    -0x28(%rbp),%rax
  add    %rax,%rdx
  mov    -0x14(%rbp),%eax
  cltq
  mov    (%rdx,%rax,4),%eax
  test   %eax,%eax
  je     L384
  mov    $0x0,%eax
  jmp    L115
L384:
  subl   $0x1,-0x10(%rbp)
L110:
  mov    -0x10(%rbp),%eax
  cmp    -0x18(%rbp),%eax
  jg     L117
  addl   $0x1,-0x18(%rbp)
L255:
  cmpl   $0x8,-0x18(%rbp)
  jle    L233
  addl   $0x1,-0x14(%rbp)
L400:
  cmpl   $0x8,-0x14(%rbp)
  jle    L171
  movl   $0x0,-0x14(%rbp)
  jmp    L446
L361:
  movl   $0x0,-0x18(%rbp)
  jmp    L479
L103:
  movl   $0x8,-0xc(%rbp)
  jmp    L46
L35:
  mov    -0xc(%rbp),%eax
  cmp    -0x14(%rbp),%eax
  je     L456
  mov    -0x18(%rbp),%eax
  movslq %eax,%rdx
  mov    %rdx,%rax
  shl    $0x3,%rax
  add    %rdx,%rax
  shl    $0x2,%rax
  mov    %rax,%rdx
  mov    -0x28(%rbp),%rax
  add    %rax,%rdx
  mov    -0xc(%rbp),%eax
  cltq
  mov    (%rdx,%rax,4),%ecx
  mov    -0x18(%rbp),%eax
  movslq %eax,%rdx
  mov    %rdx,%rax
  shl    $0x3,%rax
  add    %rdx,%rax
  shl    $0x2,%rax
  mov    %rax,%rdx
  mov    -0x28(%rbp),%rax
  add    %rax,%rdx
  mov    -0x14(%rbp),%eax
  cltq
  mov    (%rdx,%rax,4),%eax
  cmp    %eax,%ecx
  jne    L456
  mov    -0x18(%rbp),%eax
  movslq %eax,%rdx
  mov    %rdx,%rax
  shl    $0x3,%rax
  add    %rdx,%rax
  shl    $0x2,%rax
  mov    %rax,%rdx
  mov    -0x28(%rbp),%rax
  add    %rax,%rdx
  mov    -0xc(%rbp),%eax
  cltq
  mov    (%rdx,%rax,4),%eax
  test   %eax,%eax
  je     L456
  mov    $0x0,%eax
  jmp    L115
L456:
  subl   $0x1,-0xc(%rbp)
L46:
  mov    -0xc(%rbp),%eax
  cmp    -0x14(%rbp),%eax
  jg     L35
  addl   $0x1,-0x18(%rbp)
L479:
  cmpl   $0x8,-0x18(%rbp)
  jle    L103
  addl   $0x1,-0x14(%rbp)
L446:
  cmpl   $0x8,-0x14(%rbp)
  jle    L361
  movl   $0x0,-0x14(%rbp)
  jmp    L420
L155:
  movl   $0x0,-0x18(%rbp)
  jmp    L199
L385:
  cmpl   $0x0,-0x18(%rbp)
  js     L292
  cmpl   $0x2,-0x18(%rbp)
  jg     L292
  movl   $0x0,-0x8(%rbp)
  jmp    L365
L292:
  cmpl   $0x2,-0x18(%rbp)
  jle    L279
  cmpl   $0x5,-0x18(%rbp)
  jg     L279
  movl   $0x3,-0x8(%rbp)
  jmp    L365
L279:
  cmpl   $0x5,-0x18(%rbp)
  jle    L365
  cmpl   $0x8,-0x18(%rbp)
  jg     L365
  movl   $0x6,-0x8(%rbp)
L365:
  cmpl   $0x0,-0x14(%rbp)
  js     L164
  cmpl   $0x2,-0x14(%rbp)
  jg     L164
  movl   $0x0,-0x4(%rbp)
  jmp    L4
L164:
  cmpl   $0x2,-0x14(%rbp)
  jle    L311
  cmpl   $0x5,-0x14(%rbp)
  jg     L311
  movl   $0x3,-0x4(%rbp)
  jmp    L4
L311:
  cmpl   $0x5,-0x14(%rbp)
  jle    L4
  cmpl   $0x8,-0x14(%rbp)
  jg     L4
  movl   $0x6,-0x4(%rbp)
L4:
  movl   $0x0,-0xc(%rbp)
  jmp    L141
L276:
  movl   $0x0,-0x10(%rbp)
  jmp    L406
L1:
  mov    -0x4(%rbp),%edx
  mov    -0xc(%rbp),%eax
  add    %edx,%eax
  cmp    %eax,-0x14(%rbp)
  jne    L77
  mov    -0x8(%rbp),%edx
  mov    -0x10(%rbp),%eax
  add    %edx,%eax
  cmp    %eax,-0x18(%rbp)
  je     L161
L77:
  mov    -0x8(%rbp),%edx
  mov    -0x10(%rbp),%eax
  add    %edx,%eax
  movslq %eax,%rdx
  mov    %rdx,%rax
  shl    $0x3,%rax
  add    %rdx,%rax
  shl    $0x2,%rax
  mov    %rax,%rdx
  mov    -0x28(%rbp),%rax
  add    %rax,%rdx
  mov    -0x4(%rbp),%ecx
  mov    -0xc(%rbp),%eax
  add    %ecx,%eax
  cltq
  mov    (%rdx,%rax,4),%ecx
  mov    -0x18(%rbp),%eax
  movslq %eax,%rdx
  mov    %rdx,%rax
  shl    $0x3,%rax
  add    %rdx,%rax
  shl    $0x2,%rax
  mov    %rax,%rdx
  mov    -0x28(%rbp),%rax
  add    %rax,%rdx
  mov    -0x14(%rbp),%eax
  cltq
  mov    (%rdx,%rax,4),%eax
  cmp    %eax,%ecx
  jne    L161
  mov    -0x8(%rbp),%edx
  mov    -0x10(%rbp),%eax
  add    %edx,%eax
  movslq %eax,%rdx
  mov    %rdx,%rax
  shl    $0x3,%rax
  add    %rdx,%rax
  shl    $0x2,%rax
  mov    %rax,%rdx
  mov    -0x28(%rbp),%rax
  add    %rax,%rdx
  mov    -0x4(%rbp),%ecx
  mov    -0xc(%rbp),%eax
  add    %ecx,%eax
  cltq
  mov    (%rdx,%rax,4),%eax
  test   %eax,%eax
  je     L161
  mov    $0x0,%eax
  jmp    L115
L161:
  addl   $0x1,-0x10(%rbp)
L406:
  cmpl   $0x2,-0x10(%rbp)
  jle    L1
  addl   $0x1,-0xc(%rbp)
L141:
  cmpl   $0x2,-0xc(%rbp)
  jle    L276
  addl   $0x1,-0x18(%rbp)
L199:
  cmpl   $0x8,-0x18(%rbp)
  jle    L385
  addl   $0x1,-0x14(%rbp)
L420:
  cmpl   $0x8,-0x14(%rbp)
  jle    L155
  mov    $0x1,%eax
L115:
  pop    %rbp
  ret
```

assistant: ```c
int validity(int grid[9][9]) {
  int x, y, testx, testy, startx, starty, loop;
  for (y = 0; y < 9; ++y)
    for (x = 0; x < 9; ++x)
      for (testx = 8; testx > x; --testx)
        if ((testx != x) && (grid[testx][y] == grid[x][y]) && (grid[testx][y] != 0)) {
          return 0;
        }
  for (y = 0; y < 9; ++y)
    for (x = 0; x < 9; ++x)
      for (testy = 8; testy > y; --testy)
        if ((testy != y) && (grid[x][testy] == grid[x][y]) && (grid[x][testy] != 0)) {
          return 0;
        }
  for (y = 0; y < 9; ++y)
    for (x = 0; x < 9; ++x) {
      if ((x >= 0) && (x <= 2))
        startx = 0;
      else if ((x >= 3) && (x <= 5))
        startx = 3;
      else if ((x >= 6) && (x <= 8))
        startx = 6;
      if ((y >= 0) && (y <= 2))
        starty = 0;
      else if ((y >= 3) && (y <= 5))
        starty = 3;
      else if ((y >= 6) && (y <= 8))
        starty = 6;
      for (testy = 0; testy < 3; ++testy)
        for (testx = 0; testx < 3; ++testx)
          if (!(((starty + testy) == y) && ((startx + testx) == x)) && (grid[startx + testx][starty + testy] == grid[x][y]) && (grid[startx + testx][starty + testy] != 0)) {
            return 0;
          }
    }
  return 1;
}
```