user: 下面的汇编指令对应的C源代码是什么：

```asm
<test>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x20,%rsp
  mov    %edi,-0x14(%rbp)
  mov    %esi,-0x18(%rbp)
  movl   $0x1,-0x8(%rbp)
  jmp    L131
L68:
  movl   $0x1,-0x4(%rbp)
  jmp    L72
L150:
  mov    $0x1,%edi
  call   <hash@plt>
  mov    -0x8(%rbp),%eax
  mov    %eax,%edi
  call   <hash@plt>
  mov    -0x4(%rbp),%eax
  mov    %eax,%edi
  call   <hash@plt>
  addl   $0x1,-0x4(%rbp)
L72:
  mov    -0x4(%rbp),%eax
  cmp    -0x14(%rbp),%eax
  jle    L150
  addl   $0x1,-0x8(%rbp)
L131:
  cmpl   $0x2,-0x8(%rbp)
  jle    L68
  movl   $0x3,-0x8(%rbp)
  jmp    L106
L9:
  movl   $0x1,-0x4(%rbp)
  jmp    L109
L29:
  mov    $0x1,%edi
  call   <hash@plt>
  mov    -0x8(%rbp),%eax
  mov    %eax,%edi
  call   <hash@plt>
  mov    -0x4(%rbp),%eax
  mov    %eax,%edi
  call   <hash@plt>
  addl   $0x1,-0x4(%rbp)
L109:
  mov    -0x8(%rbp),%eax
  cmp    -0x4(%rbp),%eax
  jg     L29
  mov    $0x1,%edi
  call   <hash@plt>
  mov    -0x8(%rbp),%eax
  mov    %eax,%edi
  call   <hash@plt>
  mov    -0x8(%rbp),%eax
  mov    %eax,%edi
  call   <hash@plt>
  mov    $0x2,%edi
  call   <hash@plt>
  mov    -0x8(%rbp),%eax
  mov    %eax,%edi
  call   <hash@plt>
  mov    -0x8(%rbp),%eax
  mov    %eax,%edi
  call   <hash@plt>
  mov    -0x8(%rbp),%eax
  add    $0x1,%eax
  mov    %eax,-0x4(%rbp)
  jmp    L67
L38:
  mov    $0x1,%edi
  call   <hash@plt>
  mov    -0x8(%rbp),%eax
  mov    %eax,%edi
  call   <hash@plt>
  mov    -0x4(%rbp),%eax
  mov    %eax,%edi
  call   <hash@plt>
  addl   $0x1,-0x4(%rbp)
L67:
  mov    -0x4(%rbp),%eax
  cmp    -0x14(%rbp),%eax
  jle    L38
  addl   $0x1,-0x8(%rbp)
L106:
  mov    -0x14(%rbp),%eax
  cmp    -0x8(%rbp),%eax
  jg     L9
  movl   $0x1,-0x4(%rbp)
  jmp    L36
L12:
  mov    $0x1,%edi
  call   <hash@plt>
  mov    -0x14(%rbp),%eax
  mov    %eax,%edi
  call   <hash@plt>
  mov    -0x4(%rbp),%eax
  mov    %eax,%edi
  call   <hash@plt>
  addl   $0x1,-0x4(%rbp)
L36:
  mov    -0x14(%rbp),%eax
  cmp    -0x4(%rbp),%eax
  jg     L12
  mov    $0x1,%edi
  call   <hash@plt>
  mov    -0x14(%rbp),%eax
  mov    %eax,%edi
  call   <hash@plt>
  mov    -0x14(%rbp),%eax
  mov    %eax,%edi
  call   <hash@plt>
  mov    $0x2,%edi
  call   <hash@plt>
  mov    -0x14(%rbp),%eax
  mov    %eax,%edi
  call   <hash@plt>
  mov    -0x14(%rbp),%eax
  mov    %eax,%edi
  call   <hash@plt>
  mov    -0x14(%rbp),%eax
  add    $0x1,%eax
  mov    %eax,-0x8(%rbp)
  jmp    L50
L54:
  movl   $0x1,-0x4(%rbp)
  jmp    L146
L141:
  mov    $0x1,%edi
  call   <hash@plt>
  mov    -0x8(%rbp),%eax
  mov    %eax,%edi
  call   <hash@plt>
  mov    -0x4(%rbp),%eax
  mov    %eax,%edi
  call   <hash@plt>
  addl   $0x1,-0x4(%rbp)
L146:
  mov    -0x4(%rbp),%eax
  cmp    -0x14(%rbp),%eax
  jle    L141
  mov    $0x2,%edi
  call   <hash@plt>
  mov    -0x8(%rbp),%eax
  mov    %eax,%edi
  call   <hash@plt>
  mov    -0x8(%rbp),%eax
  mov    %eax,%edi
  call   <hash@plt>
  addl   $0x1,-0x8(%rbp)
L50:
  mov    -0x8(%rbp),%eax
  cmp    -0x18(%rbp),%eax
  jle    L54
  nop
  nop
  leave
  ret
```

assistant: ```c
void test(int M, int N) {
  int i, j;
  for (i = 1; i <= 2; i++) {
    for (j = 1; j <= M; j++) {
      {
        hash(1);
        hash(i);
        hash(j);
      };
    }
  }
  for (i = 3; i <= M - 1; i++) {
    for (j = 1; j <= i - 1; j++) {
      {
        hash(1);
        hash(i);
        hash(j);
      };
    }
    {
      hash(1);
      hash(i);
      hash(i);
    };
    {
      hash(2);
      hash(i);
      hash(i);
    };
    for (j = i + 1; j <= M; j++) {
      {
        hash(1);
        hash(i);
        hash(j);
      };
    }
  }
  for (j = 1; j <= M - 1; j++) {
    {
      hash(1);
      hash(M);
      hash(j);
    };
  }
  {
    hash(1);
    hash(M);
    hash(M);
  };
  {
    hash(2);
    hash(M);
    hash(M);
  };
  for (i = M + 1; i <= N; i++) {
    for (j = 1; j <= M; j++) {
      {
        hash(1);
        hash(i);
        hash(j);
      };
    }
    {
      hash(2);
      hash(i);
      hash(i);
    };
  }
}
```