user: 请显示与下面列出的汇编代码相匹配的C语言实现：

```asm
<Mastrfu>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  push   %rbx
  sub    $0x198,%rsp
  mov    %rdi,-0x198(%rbp)
  mov    %fs:0x28,%rax
  mov    %rax,-0x18(%rbp)
  xor    %eax,%eax
  mov    -0x198(%rbp),%rax
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <cdoInitialize@plt>
  mov    $0x0,%edi
  mov    $0x0,%eax
  call   <cdoStreamName@plt>
  mov    %eax,%edi
  mov    $0x0,%eax
  call   <pstreamOpenRead@plt>
  mov    %eax,-0x170(%rbp)
  mov    -0x170(%rbp),%eax
  mov    %eax,%edi
  mov    $0x0,%eax
  call   <pstreamInqVlist@plt>
  mov    %eax,-0x16c(%rbp)
  mov    -0x16c(%rbp),%eax
  mov    %eax,%edi
  mov    $0x0,%eax
  call   <vlistNvars@plt>
  mov    %eax,-0x168(%rbp)
  cmpl   $0x1,-0x168(%rbp)
  je     L26
  lea    D117(%rip),%rax
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <cdoAbort@plt>
L26:
  mov    -0x16c(%rbp),%eax
  mov    $0x0,%esi
  mov    %eax,%edi
  mov    $0x0,%eax
  call   <vlistInqVarCode@plt>
  mov    %eax,-0x164(%rbp)
  cmpl   $0x0,-0x164(%rbp)
  jle    L100
  cmpl   $0x84,-0x164(%rbp)
  je     L100
  mov    -0x164(%rbp),%eax
  mov    %eax,%esi
  lea    D5(%rip),%rax
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <cdoWarning@plt>
L100:
  mov    -0x16c(%rbp),%eax
  mov    $0x0,%esi
  mov    %eax,%edi
  mov    $0x0,%eax
  call   <vlistInqVarMissval@plt>
  pxor   %xmm0,%xmm0
  cvtsi2sd %eax,%xmm0
  movsd  %xmm0,-0x138(%rbp)
  mov    -0x16c(%rbp),%eax
  mov    $0x0,%esi
  mov    %eax,%edi
  mov    $0x0,%eax
  call   <vlistInqVarZaxis@plt>
  mov    %eax,-0x160(%rbp)
  mov    -0x160(%rbp),%eax
  mov    %eax,%edi
  mov    $0x0,%eax
  call   <zaxisInqType@plt>
  cmp    $0x4,%eax
  je     L89
  mov    -0x160(%rbp),%eax
  mov    %eax,%edi
  mov    $0x0,%eax
  call   <zaxisInqType@plt>
  cmp    $0x1,%eax
  je     L89
  lea    -0x120(%rbp),%rdx
  mov    -0x160(%rbp),%eax
  mov    %rdx,%rsi
  mov    %eax,%edi
  mov    $0x0,%eax
  call   <zaxisInqLongname@plt>
  lea    -0x120(%rbp),%rax
  mov    %rax,%rsi
  lea    D94(%rip),%rax
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <cdoWarning@plt>
L89:
  mov    -0x16c(%rbp),%eax
  mov    $0x0,%esi
  mov    %eax,%edi
  mov    $0x0,%eax
  call   <vlistInqVarGrid@plt>
  mov    %eax,-0x15c(%rbp)
  mov    -0x15c(%rbp),%eax
  mov    %eax,%edi
  mov    $0x0,%eax
  call   <gridInqXsize@plt>
  cmp    $0x1,%eax
  jle    L94
  lea    D111(%rip),%rax
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <cdoAbort@plt>
L94:
  mov    -0x15c(%rbp),%eax
  mov    %eax,%edi
  mov    $0x0,%eax
  call   <gridInqSize@plt>
  mov    %eax,-0x158(%rbp)
  mov    -0x160(%rbp),%eax
  mov    %eax,%edi
  mov    $0x0,%eax
  call   <zaxisInqSize@plt>
  mov    %eax,-0x154(%rbp)
  mov    -0x16c(%rbp),%eax
  mov    %eax,%edi
  mov    $0x0,%eax
  call   <vlistDuplicate@plt>
  mov    %eax,-0x150(%rbp)
  mov    -0x16c(%rbp),%eax
  mov    %eax,%edi
  mov    $0x0,%eax
  call   <vlistInqTaxis@plt>
  mov    %eax,-0x14c(%rbp)
  mov    -0x14c(%rbp),%eax
  mov    %eax,%edi
  mov    $0x0,%eax
  call   <taxisDuplicate@plt>
  mov    %eax,-0x148(%rbp)
  mov    -0x148(%rbp),%edx
  mov    -0x150(%rbp),%eax
  mov    %edx,%esi
  mov    %eax,%edi
  mov    $0x0,%eax
  call   <vlistDefTaxis@plt>
  mov    -0x150(%rbp),%eax
  mov    $0x110,%edx
  mov    $0x0,%esi
  mov    %eax,%edi
  mov    $0x0,%eax
  call   <vlistDefVarCode@plt>
  mov    -0x150(%rbp),%eax
  lea    D97(%rip),%rdx
  mov    $0x0,%esi
  mov    %eax,%edi
  mov    $0x0,%eax
  call   <vlistDefVarName@plt>
  mov    -0x150(%rbp),%eax
  lea    D27(%rip),%rdx
  mov    $0x0,%esi
  mov    %eax,%edi
  mov    $0x0,%eax
  call   <vlistDefVarLongname@plt>
  mov    -0x150(%rbp),%eax
  lea    D15(%rip),%rdx
  mov    $0x0,%esi
  mov    %eax,%edi
  mov    $0x0,%eax
  call   <vlistDefVarUnits@plt>
  mov    -0x150(%rbp),%eax
  mov    $0x84,%edx
  mov    $0x0,%esi
  mov    %eax,%edi
  mov    $0x0,%eax
  call   <vlistDefVarDatatype@plt>
  mov    $0x0,%eax
  call   <cdoFiletype@plt>
  mov    %eax,%ebx
  mov    $0x1,%edi
  mov    $0x0,%eax
  call   <cdoStreamName@plt>
  mov    %ebx,%esi
  mov    %eax,%edi
  mov    $0x0,%eax
  call   <pstreamOpenWrite@plt>
  mov    %eax,-0x144(%rbp)
  mov    -0x150(%rbp),%edx
  mov    -0x144(%rbp),%eax
  mov    %edx,%esi
  mov    %eax,%edi
  mov    $0x0,%eax
  call   <pstreamDefVlist@plt>
  mov    -0x158(%rbp),%eax
  imul   -0x154(%rbp),%eax
  cltq
  shl    $0x3,%rax
  mov    %rax,%rcx
  mov    $0xaa,%edx
  lea    D11(%rip),%rax
  mov    %rax,%rsi
  lea    D66(%rip),%rax
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <Malloc@plt>
  cltq
  mov    %rax,-0x130(%rbp)
  mov    -0x158(%rbp),%eax
  imul   -0x154(%rbp),%eax
  cltq
  shl    $0x3,%rax
  mov    %rax,%rcx
  mov    $0xab,%edx
  lea    D11(%rip),%rax
  mov    %rax,%rsi
  lea    D66(%rip),%rax
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <Malloc@plt>
  cltq
  mov    %rax,-0x128(%rbp)
  movl   $0x0,-0x17c(%rbp)
  jmp    L38
L65:
  mov    -0x14c(%rbp),%edx
  mov    -0x148(%rbp),%eax
  mov    %edx,%esi
  mov    %eax,%edi
  mov    $0x0,%eax
  call   <taxisCopyTimestep@plt>
  mov    -0x17c(%rbp),%edx
  mov    -0x144(%rbp),%eax
  mov    %edx,%esi
  mov    %eax,%edi
  mov    $0x0,%eax
  call   <pstreamDefTimestep@plt>
  movl   $0x0,-0x174(%rbp)
  movl   $0x0,-0x178(%rbp)
  jmp    L1
L109:
  lea    -0x184(%rbp),%rdx
  lea    -0x188(%rbp),%rcx
  mov    -0x170(%rbp),%eax
  mov    %rcx,%rsi
  mov    %eax,%edi
  mov    $0x0,%eax
  call   <pstreamInqRecord@plt>
  mov    -0x184(%rbp),%eax
  mov    -0x158(%rbp),%edx
  imul   %edx,%eax
  mov    %eax,-0x13c(%rbp)
  mov    -0x13c(%rbp),%eax
  cltq
  lea    0x0(,%rax,8),%rdx
  mov    -0x130(%rbp),%rax
  lea    (%rdx,%rax,1),%rcx
  lea    -0x180(%rbp),%rdx
  mov    -0x170(%rbp),%eax
  mov    %rcx,%rsi
  mov    %eax,%edi
  mov    $0x0,%eax
  call   <pstreamReadRecord@plt>
  mov    -0x180(%rbp),%eax
  add    %eax,-0x174(%rbp)
  addl   $0x1,-0x178(%rbp)
L1:
  mov    -0x178(%rbp),%eax
  cmp    -0x140(%rbp),%eax
  jl     L109
  mov    -0x138(%rbp),%rdi
  mov    -0x174(%rbp),%r8d
  mov    -0x128(%rbp),%rcx
  mov    -0x130(%rbp),%rdx
  mov    -0x160(%rbp),%esi
  mov    -0x15c(%rbp),%eax
  movq   %rdi,%xmm0
  mov    %eax,%edi
  mov    $0x1,%eax
  call   <mastrfu@plt>
  movl   $0x0,-0x178(%rbp)
  jmp    L112
L123:
  movl   $0x0,-0x188(%rbp)
  mov    -0x178(%rbp),%eax
  mov    %eax,-0x184(%rbp)
  mov    -0x184(%rbp),%edx
  mov    -0x188(%rbp),%ecx
  mov    -0x144(%rbp),%eax
  mov    %ecx,%esi
  mov    %eax,%edi
  mov    $0x0,%eax
  call   <pstreamDefRecord@plt>
  mov    -0x184(%rbp),%eax
  mov    -0x158(%rbp),%edx
  imul   %edx,%eax
  mov    %eax,-0x13c(%rbp)
  mov    -0x13c(%rbp),%eax
  cltq
  lea    0x0(,%rax,8),%rdx
  mov    -0x128(%rbp),%rax
  lea    (%rdx,%rax,1),%rcx
  mov    -0x174(%rbp),%edx
  mov    -0x144(%rbp),%eax
  mov    %rcx,%rsi
  mov    %eax,%edi
  mov    $0x0,%eax
  call   <pstreamWriteRecord@plt>
  addl   $0x1,-0x178(%rbp)
L112:
  mov    -0x178(%rbp),%eax
  cmp    -0x140(%rbp),%eax
  jl     L123
  addl   $0x1,-0x17c(%rbp)
L38:
  mov    -0x17c(%rbp),%edx
  mov    -0x170(%rbp),%eax
  mov    %edx,%esi
  mov    %eax,%edi
  mov    $0x0,%eax
  call   <pstreamInqTimestep@plt>
  mov    %eax,-0x140(%rbp)
  cmpl   $0x0,-0x140(%rbp)
  jne    L65
  mov    -0x144(%rbp),%eax
  mov    %eax,%edi
  mov    $0x0,%eax
  call   <pstreamClose@plt>
  mov    -0x170(%rbp),%eax
  mov    %eax,%edi
  mov    $0x0,%eax
  call   <pstreamClose@plt>
  cmpq   $0x0,-0x130(%rbp)
  je     L28
  mov    -0x130(%rbp),%rax
  mov    %rax,%rcx
  mov    $0xcd,%edx
  lea    D11(%rip),%rax
  mov    %rax,%rsi
  lea    D66(%rip),%rax
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <Free@plt>
L28:
  cmpq   $0x0,-0x128(%rbp)
  je     L15
  mov    -0x128(%rbp),%rax
  mov    %rax,%rcx
  mov    $0xce,%edx
  lea    D11(%rip),%rax
  mov    %rax,%rsi
  lea    D66(%rip),%rax
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <Free@plt>
L15:
  mov    $0x0,%eax
  call   <cdoFinish@plt>
  mov    $0x0,%eax
  mov    -0x18(%rbp),%rdx
  sub    %fs:0x28,%rdx
  je     L128
  call   <__stack_chk_fail@plt>
L128:
  mov    -0x8(%rbp),%rbx
  leave
  ret
```

tool_calls: name: retrieve_data
arguments: data_tag: D117
type_infered: string
name: retrieve_data
arguments: data_tag: D5
type_infered: string
name: retrieve_data
arguments: data_tag: D94
type_infered: string
name: retrieve_data
arguments: data_tag: D111
type_infered: string
name: retrieve_data
arguments: data_tag: D97
type_infered: string
name: retrieve_data
arguments: data_tag: D27
type_infered: string
name: retrieve_data
arguments: data_tag: D15
type_infered: string
name: retrieve_data
arguments: data_tag: D11
type_infered: string
name: retrieve_data
arguments: data_tag: D66
type_infered: string

tool: D117: This operator works only with one variable!

tool: D5: Unexpected code %d!

tool: D94: Unexpected vertical grid %s!

tool: D111: Grid must be a zonal mean!

tool: D97: mastrfu

tool: D27: mass stream function

tool: D15: kg/s

tool: D11: /scratch/repos/new/home/jordi_armengol_estape/c-scraper/outputs/2022-01-22/02-19-57/repos/AZed/cdo/refs/heads/master/src/Mastrfu.c

tool: D66: Mastrfu

assistant: ```c
void *Mastrfu(void *argument) {
  int streamID1, streamID2;
  int nrecs;
  int tsID, recID, varID, levelID;
  int gridsize;
  int nvars, code, gridID, zaxisID, nlev;
  int vlistID1, vlistID2;
  int offset;
  int nmiss, nmiss1;
  double missval;
  double *array1, *array2;
  int taxisID1, taxisID2;
  cdoInitialize(argument);
  streamID1 = pstreamOpenRead(cdoStreamName(0));
  vlistID1 = pstreamInqVlist(streamID1);
  nvars = vlistNvars(vlistID1);
  if (nvars != 1)
    cdoAbort("This operator works only with one variable!");
  code = vlistInqVarCode(vlistID1, 0);
  if (code > 0 && code != 132)
    cdoWarning("Unexpected code %d!", code);
  missval = vlistInqVarMissval(vlistID1, 0);
  zaxisID = vlistInqVarZaxis(vlistID1, 0);
  if (zaxisInqType(zaxisID) != 4 && zaxisInqType(zaxisID) != 1) {
    char longname[256];
    zaxisInqLongname(zaxisID, longname);
    cdoWarning("Unexpected vertical grid %s!", longname);
  }
  gridID = vlistInqVarGrid(vlistID1, 0);
  if (gridInqXsize(gridID) > 1)
    cdoAbort("Grid must be a zonal mean!");
  gridsize = gridInqSize(gridID);
  nlev = zaxisInqSize(zaxisID);
  vlistID2 = vlistDuplicate(vlistID1);
  taxisID1 = vlistInqTaxis(vlistID1);
  taxisID2 = taxisDuplicate(taxisID1);
  vlistDefTaxis(vlistID2, taxisID2);
  vlistDefVarCode(vlistID2, 0, 272);
  vlistDefVarName(vlistID2, 0, "mastrfu");
  vlistDefVarLongname(vlistID2, 0, "mass stream function");
  vlistDefVarUnits(vlistID2, 0, "kg/s");
  vlistDefVarDatatype(vlistID2, 0, 132);
  streamID2 = pstreamOpenWrite(cdoStreamName(1), cdoFiletype());
  pstreamDefVlist(streamID2, vlistID2);
  array1 = (double *)Malloc(__func__, "/scratch/repos/new/home/jordi_armengol_estape/c-scraper/outputs/2022-01-22/02-19-57/repos/AZed/cdo/refs/heads/master/src/Mastrfu.c", 170, (gridsize * nlev * sizeof(double)));
  array2 = (double *)Malloc(__func__, "/scratch/repos/new/home/jordi_armengol_estape/c-scraper/outputs/2022-01-22/02-19-57/repos/AZed/cdo/refs/heads/master/src/Mastrfu.c", 171, (gridsize * nlev * sizeof(double)));
  tsID = 0;
  while ((nrecs = pstreamInqTimestep(streamID1, tsID))) {
    taxisCopyTimestep(taxisID2, taxisID1);
    pstreamDefTimestep(streamID2, tsID);
    nmiss = 0;
    for (recID = 0; recID < nrecs; recID++) {
      pstreamInqRecord(streamID1, &varID, &levelID);
      offset = gridsize * levelID;
      pstreamReadRecord(streamID1, array1 + offset, &nmiss1);
      nmiss += nmiss1;
    }
    mastrfu(gridID, zaxisID, array1, array2, nmiss, missval);
    for (recID = 0; recID < nrecs; recID++) {
      varID = 0;
      levelID = recID;
      pstreamDefRecord(streamID2, varID, levelID);
      offset = gridsize * levelID;
      pstreamWriteRecord(streamID2, array2 + offset, nmiss);
    }
    tsID++;
  }
  pstreamClose(streamID2);
  pstreamClose(streamID1);
  if (array1)
    Free(__func__, "/scratch/repos/new/home/jordi_armengol_estape/c-scraper/outputs/2022-01-22/02-19-57/repos/AZed/cdo/refs/heads/master/src/Mastrfu.c", 205, (array1));
  if (array2)
    Free(__func__, "/scratch/repos/new/home/jordi_armengol_estape/c-scraper/outputs/2022-01-22/02-19-57/repos/AZed/cdo/refs/heads/master/src/Mastrfu.c", 206, (array2));
  cdoFinish();
  return (0);
}
```