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

```asm
<connected_component_filter>:
  endbr64
  push   %r15
  push   %r14
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  sub    $0x38,%rsp
  mov    %rdi,%r12
  mov    %esi,0x1c(%rsp)
  mov    %edx,%r13d
  mov    %rcx,%r14
  movss  %xmm0,0x14(%rsp)
  imul   %edx,%esi
  mov    %esi,%ebx
  mov    %esi,0x28(%rsp)
  call   <adsf_begin@plt>
  test   %ebx,%ebx
  jle    L40
  mov    %ebx,%ebp
  mov    $0x0,%ebx
  jmp    L90
L141:
  add    $0x1,%rbx
  cmp    %rbp,%rbx
  je     L179
L90:
  movss  (%r14,%rbx,4),%xmm0
  call   <isnan@plt>
  test   %rax,%rax
  je     L141
  movl   $0xffffffff,(%r12,%rbx,4)
  jmp    L141
L49:
  movss  (%r14,%rbp,1),%xmm0
  subss  (%r14,%rax,4),%xmm0
  call   <fabs@plt>
  movss  0x14(%rsp),%xmm1
  comiss %xmm0,%xmm1
  ja     L229
L60:
  cmpl   $0x0,(%r12,%rbp,1)
  jns    L239
L80:
  add    $0x1,%ebx
  add    $0x4,%rbp
  cmp    %r15d,%ebx
  je     L125
L21:
  mov    %ebx,0xc(%rsp)
  cmpl   $0x0,(%r12,%rbp,1)
  js     L80
  lea    0x1(%rbx),%r13d
  movslq %r13d,%rax
  cmpl   $0x0,(%r12,%rax,4)
  jns    L49
L239:
  mov    0x10(%rsp),%eax
  lea    (%rax,%rbx,1),%r13d
  movslq %r13d,%rax
  cmpl   $0x0,(%r12,%rax,4)
  js     L80
  movss  (%r14,%rbp,1),%xmm0
  subss  (%r14,%rax,4),%xmm0
  call   <fabs@plt>
  movss  0x14(%rsp),%xmm2
  comiss %xmm0,%xmm2
  jbe    L80
  mov    %r13d,%ecx
  mov    0xc(%rsp),%edx
  mov    0x28(%rsp),%esi
  mov    %r12,%rdi
  call   <adsf_union@plt>
  jmp    L80
L229:
  mov    %r13d,%ecx
  mov    0xc(%rsp),%edx
  mov    0x28(%rsp),%esi
  mov    %r12,%rdi
  call   <adsf_union@plt>
  jmp    L60
L125:
  addl   $0x1,0x18(%rsp)
  mov    0x18(%rsp),%eax
  mov    0x1c(%rsp),%ecx
  add    %ecx,%r15d
  add    %ecx,0x20(%rsp)
  add    %ecx,0x24(%rsp)
  cmp    0x2c(%rsp),%eax
  jge    L0
L218:
  mov    0x24(%rsp),%eax
  movslq %eax,%rbp
  shl    $0x2,%rbp
  mov    %eax,%ebx
  mov    0x20(%rsp),%edx
  sub    %eax,%edx
  mov    %edx,0x10(%rsp)
  cmpl   $0x1,0x1c(%rsp)
  jg     L21
  jmp    L125
L0:
  cmpl   $0x0,0x28(%rsp)
  jle    L53
L188:
  mov    $0x0,%ebx
  mov    0x28(%rsp),%ebp
  jmp    L223
L180:
  add    $0x1,%rbx
  cmp    %ebx,%ebp
  jle    L53
L223:
  mov    %ebx,%edx
  cmpl   $0x0,(%r12,%rbx,4)
  js     L180
  mov    %ebp,%esi
  mov    %r12,%rdi
  call   <adsf_find@plt>
  mov    %eax,(%r12,%rbx,4)
  jmp    L180
L40:
  lea    -0x1(%r13),%eax
  mov    %eax,0x2c(%rsp)
  test   %eax,%eax
  jg     L1
L53:
  add    $0x38,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
L179:
  lea    -0x1(%r13),%eax
  mov    %eax,0x2c(%rsp)
  test   %eax,%eax
  jle    L188
L1:
  mov    0x1c(%rsp),%eax
  lea    -0x1(%rax),%r15d
  mov    %eax,0x20(%rsp)
  movl   $0x0,0x24(%rsp)
  movl   $0x0,0x18(%rsp)
  jmp    L218
```

assistant: ```c
void connected_component_filter(int *rep, int w, int h, float *in, float intensity_threshold) {
  adsf_begin(rep, w * h);
  for (int i = 0; i < w * h; i++)
    if (isnan(in[i]))
      rep[i] = -1;
  for (int j = 0; j < h - 1; j++)
    for (int i = 0; i < w - 1; i++) {
      int p0 = j * w + i;
      int p1 = j * w + i + 1;
      int p2 = (j + 1) * w + i;
      if (rep[p0] >= 0 && rep[p1] >= 0 && fabs(in[p0] - in[p1]) < intensity_threshold)
        adsf_union(rep, w * h, p0, p1);
      if (rep[p0] >= 0 && rep[p2] >= 0 && fabs(in[p0] - in[p2]) < intensity_threshold)
        adsf_union(rep, w * h, p0, p2);
    }
  for (int i = 0; i < w * h; i++)
    if (rep[i] >= 0)
      rep[i] = adsf_find(rep, w * h, i);
}
```