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

```asm
<somassign>:
  endbr64
  push   %r15
  mov    %edi,%r15d
  push   %r14
  mov    %rdx,%r14
  push   %r13
  mov    %rcx,%r13
  push   %r12
  push   %rbp
  mov    %esi,%ebp
  push   %rbx
  mov    %r8,%rbx
  sub    $0x88,%rsp
  mov    0xc0(%rsp),%eax
  mov    %r9d,0x50(%rsp)
  movsbl 0xd8(%rsp),%edi
  mov    %eax,0x5c(%rsp)
  mov    0xc8(%rsp),%eax
  mov    %eax,0x28(%rsp)
  mov    0xd0(%rsp),%rax
  mov    %rax,0x48(%rsp)
  mov    0xe0(%rsp),%rax
  mov    %rax,0x70(%rsp)
  test   %r9d,%r9d
  jne    L92
  xor    %eax,%eax
  call   <setmetric@plt>
  movslq 0x28(%rsp),%rdi
  cltq
  mov    %rdi,%r12
  shl    $0x3,%rdi
  mov    %rax,0x10(%rsp)
  call   <malloc@plt>
  mov    %rax,%r8
  test   %r12d,%r12d
  jle    L146
  movslq %ebp,%rax
  mov    %rbx,%rdi
  mov    %r14,%rcx
  mov    %r8,%rbx
  lea    0x0(,%rax,4),%rsi
  mov    0x28(%rsp),%eax
  mov    %r8,%r14
  lea    (%r8,%rax,8),%rax
  mov    %rdi,%r8
  mov    %rax,(%rsp)
  lea    -0x1(%rbp),%eax
  lea    0x1(%rax),%r12
  mov    %r12,%rax
  mov    %ebp,%r12d
  mov    %rsi,%rbp
  mov    %r13,%rsi
  mov    %rax,%r13
L195:
  mov    %rbp,%rdi
  mov    %r8,0x20(%rsp)
  mov    %rsi,0x18(%rsp)
  mov    %rcx,0x8(%rsp)
  call   <malloc@plt>
  test   %r12d,%r12d
  mov    0x8(%rsp),%rcx
  mov    0x18(%rsp),%rsi
  mov    %rax,(%rbx)
  mov    0x20(%rsp),%r8
  lea    (%rax,%r13,4),%rdx
  jle    L72
  nopw   0x0(%rax,%rax,1)
L85:
  movl   $0x1,(%rax)
  add    $0x4,%rax
  cmp    %rax,%rdx
  jne    L85
L72:
  add    $0x8,%rbx
  cmp    %rbx,(%rsp)
  jne    L195
  mov    %r8,%rbx
  mov    %r12d,%ebp
  mov    %r14,%r8
  mov    %rsi,%r13
  mov    %rcx,%r14
  test   %r15d,%r15d
  jle    L118
L290:
  movq   $0x0,0x30(%rsp)
  mov    %r15d,0x38(%rsp)
  mov    %r8,%r15
L126:
  mov    0x30(%rsp),%rax
  sub    $0x8,%rsp
  mov    %ebp,%edi
  mov    %rbx,%r9
  mov    %r15,%r8
  mov    %r13,%rcx
  mov    %r14,%rsi
  mov    %eax,0x20(%rsp)
  push   $0x0
  push   $0x0
  push   %rax
  mov    0x68(%rsp),%r12
  mov    0x30(%rsp),%rax
  mov    (%r12),%rdx
  call   *%rax
  movsd  %xmm0,0x20(%rsp)
  mov    0x7c(%rsp),%edi
  add    $0x20,%rsp
  test   %edi,%edi
  jle    L222
  mov    %r12,0x8(%rsp)
  movl   $0x0,0x20(%rsp)
  movl   $0x0,0x50(%rsp)
  movl   $0x0,0x2c(%rsp)
  nopl   (%rax)
L103:
  mov    0x28(%rsp),%esi
  xor    %r12d,%r12d
  test   %esi,%esi
  jle    L284
  mov    %rbx,%rax
  mov    %r12d,%ebx
  mov    %rax,%r12
  nopl   0x0(%rax)
L220:
  sub    $0x8,%rsp
  mov    %r12,%r9
  mov    %r15,%r8
  mov    %r13,%rcx
  push   $0x0
  mov    %r14,%rsi
  mov    %ebp,%edi
  push   %rbx
  mov    0x30(%rsp),%eax
  push   %rax
  mov    0x28(%rsp),%rax
  mov    (%rax),%rdx
  mov    0x30(%rsp),%rax
  call   *%rax
  movsd  0x20(%rsp),%xmm1
  add    $0x20,%rsp
  comisd %xmm0,%xmm1
  jbe    L52
  mov    0x20(%rsp),%eax
  mov    %ebx,0x50(%rsp)
  movsd  %xmm0,(%rsp)
  mov    %eax,0x2c(%rsp)
L52:
  add    $0x1,%ebx
  cmp    %ebx,0x28(%rsp)
  jne    L220
  mov    %r12,%rbx
L284:
  addl   $0x1,0x20(%rsp)
  mov    0x20(%rsp),%eax
  addq   $0x8,0x8(%rsp)
  cmp    %eax,0x5c(%rsp)
  jne    L103
L229:
  mov    0x30(%rsp),%rax
  mov    0x70(%rsp),%rcx
  mov    0x2c(%rsp),%edi
  mov    %edi,(%rcx,%rax,8)
  mov    0x50(%rsp),%edi
  mov    %edi,0x4(%rcx,%rax,8)
  add    $0x1,%rax
  mov    %rax,0x30(%rsp)
  cmp    %eax,0x38(%rsp)
  jg     L126
  mov    0x28(%rsp),%ecx
  mov    %r15,%r8
  test   %ecx,%ecx
  jle    L57
L118:
  xor    %ebx,%ebx
  mov    %r8,%rbp
L5:
  mov    0x0(%rbp,%rbx,8),%rdi
  add    $0x1,%rbx
  call   <free@plt>
  cmp    %ebx,0x28(%rsp)
  jg     L5
  mov    %rbp,%r8
L57:
  mov    %r8,%rdi
  jmp    L297
L92:
  xor    %eax,%eax
  movslq %r15d,%r12
  call   <setmetric@plt>
  lea    0x0(,%r12,8),%rdi
  cltq
  mov    %rdi,(%rsp)
  mov    %rax,0x20(%rsp)
  call   <malloc@plt>
  mov    (%rsp),%rdi
  mov    %rax,%r12
  call   <malloc@plt>
  mov    %rax,0x18(%rsp)
  test   %r15d,%r15d
  jle    L148
  mov    0x18(%rsp),%rax
  mov    %r15d,%ecx
  mov    %rbx,0x8(%rsp)
  mov    %rax,%rdx
  lea    (%rax,%rcx,8),%rax
  mov    %rax,(%rsp)
  mov    %rdx,%rbx
L345:
  mov    $0x4,%edi
  mov    %rcx,0x10(%rsp)
  add    $0x8,%rbx
  call   <malloc@plt>
  mov    0x10(%rsp),%rcx
  mov    %rax,-0x8(%rbx)
  cmp    (%rsp),%rbx
  movl   $0x1,(%rax)
  jne    L345
  mov    0x8(%rsp),%rbx
  test   %ebp,%ebp
  jle    L236
L255:
  movslq %ebp,%rax
  mov    %r13,0x38(%rsp)
  mov    %rbx,%r9
  mov    0x48(%rsp),%rbx
  mov    %rax,0x78(%rsp)
  lea    -0x1(%r15),%eax
  lea    0x8(,%rax,8),%rbp
  movslq 0x5c(%rsp),%rax
  movq   $0x0,0x68(%rsp)
  movl   $0x0,0x58(%rsp)
  mov    %rax,0x60(%rsp)
  movslq 0x28(%rsp),%rax
  movl   $0x0,0x54(%rsp)
  mov    %rax,0x40(%rsp)
  mov    %r14,0x30(%rsp)
  mov    %r15d,%r14d
L49:
  mov    0x68(%rsp),%eax
  mov    %eax,0x2c(%rsp)
  test   %r14d,%r14d
  jle    L55
  movslq 0x54(%rsp),%rdx
  movslq 0x58(%rsp),%rax
  mov    (%rbx,%rdx,8),%rdx
  lea    (%rdx,%rax,8),%rcx
  xor    %eax,%eax
  nopl   (%rax)
L283:
  mov    (%rcx),%rdx
  add    %rax,%rdx
  mov    %rdx,(%r12,%rax,1)
  add    $0x8,%rax
  cmp    %rbp,%rax
  jne    L283
L55:
  sub    $0x8,%rsp
  mov    %r12,%rdx
  mov    %r14d,%edi
  mov    0x58(%rsp),%eax
  push   %rax
  push   $0x0
  mov    0x44(%rsp),%eax
  push   %rax
  mov    0x38(%rsp),%r8
  mov    0x58(%rsp),%rcx
  mov    0x50(%rsp),%rsi
  mov    0x40(%rsp),%rax
  mov    %r9,0x20(%rsp)
  call   *%rax
  movsd  %xmm0,0x28(%rsp)
  mov    0x7c(%rsp),%edx
  add    $0x20,%rsp
  mov    (%rsp),%r9
  test   %edx,%edx
  jle    L119
  xor    %r13d,%r13d
  mov    %rbx,%rax
  mov    %r13,%rbx
  mov    %r14d,%r13d
  mov    %rax,%r14
  nopl   (%rax)
L346:
  mov    0x28(%rsp),%eax
  mov    %ebx,0x48(%rsp)
  test   %eax,%eax
  jle    L215
  mov    %r13d,%eax
  xor    %r15d,%r15d
  mov    %rbx,%r13
  mov    %rbp,%rbx
  mov    %eax,%ebp
  cs nopw 0x0(%rax,%rax,1)
L252:
  mov    %r15d,0x10(%rsp)
  test   %ebp,%ebp
  jle    L359
  mov    (%r14,%r13,8),%rdx
  lea    (%rdx,%r15,8),%rsi
  xor    %edx,%edx
  nopl   0x0(%rax,%rax,1)
L239:
  mov    (%rsi),%rax
  add    %rdx,%rax
  mov    %rax,(%r12,%rdx,1)
  add    $0x8,%rdx
  cmp    %rbx,%rdx
  jne    L239
L359:
  sub    $0x8,%rsp
  mov    %r12,%rdx
  mov    %ebp,%edi
  mov    0x58(%rsp),%eax
  push   %rax
  push   $0x0
  mov    0x44(%rsp),%eax
  push   %rax
  mov    0x38(%rsp),%r8
  mov    0x58(%rsp),%rcx
  mov    0x50(%rsp),%rsi
  mov    0x40(%rsp),%rax
  mov    %r9,0x20(%rsp)
  call   *%rax
  movsd  0x28(%rsp),%xmm2
  add    $0x20,%rsp
  mov    (%rsp),%r9
  comisd %xmm0,%xmm2
  jbe    L45
  mov    0x10(%rsp),%eax
  movsd  %xmm0,0x8(%rsp)
  mov    %eax,0x58(%rsp)
  mov    0x48(%rsp),%eax
  mov    %eax,0x54(%rsp)
L45:
  add    $0x1,%r15
  cmp    0x40(%rsp),%r15
  jne    L252
  mov    %ebp,%eax
  mov    %rbx,%rbp
  mov    %r13,%rbx
  mov    %eax,%r13d
L215:
  add    $0x1,%rbx
  cmp    %rbx,0x60(%rsp)
  jne    L346
  mov    %r14,%rbx
  mov    %r13d,%r14d
L119:
  mov    0x68(%rsp),%rax
  mov    0x70(%rsp),%rdi
  mov    0x54(%rsp),%ecx
  mov    %ecx,(%rdi,%rax,8)
  mov    0x58(%rsp),%ecx
  mov    %ecx,0x4(%rdi,%rax,8)
  add    $0x1,%rax
  mov    %rax,0x68(%rsp)
  cmp    0x78(%rsp),%rax
  jne    L49
  mov    %r12,%rdi
  call   <free@plt>
  mov    %r14d,%ecx
  test   %r14d,%r14d
  jle    L60
L36:
  mov    0x18(%rsp),%rax
  mov    %rax,%rbx
  lea    (%rax,%rcx,8),%rbp
L305:
  mov    (%rbx),%rdi
  add    $0x8,%rbx
  call   <free@plt>
  cmp    %rbp,%rbx
  jne    L305
L60:
  mov    0x18(%rsp),%rdi
L297:
  add    $0x88,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  jmp    1070 <free@plt>
L222:
  movl   $0x0,0x50(%rsp)
  movl   $0x0,0x2c(%rsp)
  jmp    L229
L148:
  test   %ebp,%ebp
  jg     L255
  mov    %r12,%rdi
  call   <free@plt>
  jmp    L60
L146:
  test   %r15d,%r15d
  jg     L290
  jmp    L57
L236:
  mov    %r12,%rdi
  mov    %rcx,(%rsp)
  call   <free@plt>
  mov    (%rsp),%rcx
  jmp    L36
```

assistant: ```c
void somassign(int nrows, int ncolumns, double **data, int **mask, const double weights[], int transpose, int nxgrid, int nygrid, double ***celldata, char dist, int clusterid[][2]) {
  const int ndata = (transpose == 0) ? ncolumns : nrows;
  int i, j;
  double (*metric)(int, double **, double **, int **, int **, const double[], int, int, int) = setmetric(dist);
  if (transpose == 0) {
    int **dummymask = malloc(nygrid * sizeof(int *));
    for (i = 0; i < nygrid; i++) {
      dummymask[i] = malloc(ncolumns * sizeof(int));
      for (j = 0; j < ncolumns; j++)
        dummymask[i][j] = 1;
    }
    for (i = 0; i < nrows; i++) {
      int ixbest = 0;
      int iybest = 0;
      double closest = metric(ndata, data, celldata[ixbest], mask, dummymask, weights, i, iybest, transpose);
      int ix, iy;
      for (ix = 0; ix < nxgrid; ix++) {
        for (iy = 0; iy < nygrid; iy++) {
          double distance = metric(ndata, data, celldata[ix], mask, dummymask, weights, i, iy, transpose);
          if (distance < closest) {
            ixbest = ix;
            iybest = iy;
            closest = distance;
          }
        }
      }
      clusterid[i][0] = ixbest;
      clusterid[i][1] = iybest;
    }
    for (i = 0; i < nygrid; i++)
      free(dummymask[i]);
    free(dummymask);
  } else {
    double **celldatavector = malloc(ndata * sizeof(double *));
    int **dummymask = malloc(nrows * sizeof(int *));
    int ixbest = 0;
    int iybest = 0;
    for (i = 0; i < nrows; i++) {
      dummymask[i] = malloc(sizeof(int));
      dummymask[i][0] = 1;
    }
    for (i = 0; i < ncolumns; i++) {
      double closest;
      int ix, iy;
      for (j = 0; j < ndata; j++)
        celldatavector[j] = &(celldata[ixbest][iybest][j]);
      closest = metric(ndata, data, celldatavector, mask, dummymask, weights, i, 0, transpose);
      for (ix = 0; ix < nxgrid; ix++) {
        for (iy = 0; iy < nygrid; iy++) {
          double distance;
          for (j = 0; j < ndata; j++)
            celldatavector[j] = &(celldata[ix][iy][j]);
          distance = metric(ndata, data, celldatavector, mask, dummymask, weights, i, 0, transpose);
          if (distance < closest) {
            ixbest = ix;
            iybest = iy;
            closest = distance;
          }
        }
      }
      clusterid[i][0] = ixbest;
      clusterid[i][1] = iybest;
    }
    free(celldatavector);
    for (i = 0; i < nrows; i++)
      free(dummymask[i]);
    free(dummymask);
  }
  return;
}
```