user: 提供的汇编代码用C语言表示会是什么样子：

```asm
<calculate_E_discriminative_contributions_multi>:
  endbr64
  push   %r15
  push   %r14
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  sub    $0x48,%rsp
  mov    %rcx,%r12
  mov    0x88(%rsp),%r13
  mov    0xa8(%rsp),%r14
  mov    0xc8(%rsp),%r15
  mov    0xd8(%rsp),%eax
  mov    0xf8(%rsp),%ebx
  mov    0x130(%rsp),%edx
  cmp    $0x1,%edx
  je     L435
  cmp    $0x2,%edx
  jne    L435
  mov    0xe8(%rsp),%ebx
  mov    0xb8(%rsp),%r15
  mov    0x98(%rsp),%r14
  mov    %r9,%r13
  mov    %rsi,%r12
L435:
  cmp    $0x2,%eax
  jle    L433
  sub    $0x1,%eax
  mov    %eax,(%rsp)
  movl   $0x1,0x2c(%rsp)
  jmp    L139
L82:
  mov    %ebx,%edx
  mov    %ebp,%esi
  mov    0x2c(%rsp),%edi
  call   <get_mtx_index@plt>
  cltq
  shl    $0x4,%rax
  fldt   (%r15,%rax,1)
  fstpt  (%r12,%rax,1)
  add    $0x1,%ebp
  cmp    %ebp,%ebx
  jne    L82
L412:
  mov    0x2c(%rsp),%eax
  add    $0x1,%eax
  cmp    %eax,(%rsp)
  je     L276
  mov    %eax,0x2c(%rsp)
L139:
  mov    $0x0,%ebp
  test   %ebx,%ebx
  jg     L82
  jmp    L412
L215:
  fldz
  fstpt  0x10(%rsp)
  mov    $0x0,%ebp
L125:
  mov    %ebx,%edx
  mov    %ebp,%esi
  mov    (%rsp),%edi
  call   <get_mtx_index@plt>
  cltq
  shl    $0x4,%rax
  fldt   0x0(%r13,%rax,1)
  fldt   0x10(%rsp)
  faddp  %st,%st(1)
  fstpt  0x10(%rsp)
  add    $0x1,%ebp
  cmp    %ebp,%ebx
  jg     L125
  fldz
  fldt   0x10(%rsp)
  fcomip %st(1),%st
  fstp   %st(0)
  ja     L65
L437:
  mov    (%rsp),%ecx
  lea    0x1(%rcx),%eax
  cmp    %ecx,0x2c(%rsp)
  je     L128
  mov    %eax,(%rsp)
L298:
  test   %ebx,%ebx
  jle    L437
  fldz
  fstpt  0x10(%rsp)
  mov    $0x0,%ebp
  jmp    L343
L60:
  fstp   %st(0)
L343:
  mov    %ebx,%edx
  mov    %ebp,%esi
  mov    (%rsp),%edi
  call   <get_mtx_index@plt>
  cltq
  shl    $0x4,%rax
  fldt   (%r14,%rax,1)
  fldt   0x10(%rsp)
  faddp  %st,%st(1)
  fld    %st(0)
  fstpt  0x10(%rsp)
  mov    %ebp,0x30(%rsp)
  add    $0x1,%ebp
  cmp    %ebp,%ebx
  jne    L60
  fldz
  fxch   %st(1)
  fcomip %st(1),%st
  fstp   %st(0)
  jbe    L215
  movl   $0x0,0x10(%rsp)
L266:
  mov    %ebp,%edx
  mov    0x10(%rsp),%esi
  mov    (%rsp),%edi
  call   <get_mtx_index@plt>
  mov    0x10(%rsp),%ecx
  mov    %ecx,%eax
  add    $0x1,%ecx
  mov    %ecx,0x10(%rsp)
  cmp    %eax,0x30(%rsp)
  jne    L266
  jmp    L215
L65:
  mov    $0x0,%ebp
L135:
  mov    %ebx,%edx
  mov    %ebp,%esi
  mov    (%rsp),%edi
  call   <get_mtx_index@plt>
  add    $0x1,%ebp
  cmp    %ebp,%ebx
  jg     L135
  jmp    L437
L276:
  movl   $0x1,(%rsp)
  jmp    L298
L279:
  fldt   (%r14,%rax,1)
  fldt   0x0(%r13,%rax,1)
  fsubrp %st,%st(1)
  fdivp  %st,%st(1)
  fldt   0x10(%rsp)
  fxch   %st(1)
  fucomi %st(1),%st
  fcmovbe %st(1),%st
  fstp   %st(1)
  fstpt  0x10(%rsp)
  jmp    L316
L62:
  fstp   %st(0)
L316:
  add    $0x1,%ebp
  cmp    %ebp,%ebx
  je     L22
L93:
  mov    %ebx,%edx
  mov    %ebp,%esi
  mov    (%rsp),%edi
  call   <get_mtx_index@plt>
  cltq
  shl    $0x4,%rax
  fldt   (%r12,%rax,1)
  fld1
  fsub   %st(1),%st
  fxch   %st(1)
  fcomi  %st(1),%st
  fxch   %st(1)
  fcmovbe %st(1),%st
  fldz
  fxch   %st(2)
  fucomip %st(2),%st
  fstp   %st(1)
  jp     L279
  je     L62
  jmp    L279
L22:
  mov    (%rsp),%ecx
  lea    0x1(%rcx),%eax
  cmp    %ecx,0x2c(%rsp)
  je     L329
  mov    %eax,(%rsp)
L67:
  mov    $0x0,%ebp
  test   %ebx,%ebx
  jg     L93
  jmp    L22
L128:
  fld1
  fstpt  0x10(%rsp)
  movl   $0x1,(%rsp)
  jmp    L67
L51:
  fstp   %st(0)
L378:
  fstpt  (%rdx)
  add    $0x1,%ebp
  cmp    %ebp,%ebx
  je     L422
L79:
  mov    %ebx,%edx
  mov    %ebp,%esi
  mov    (%rsp),%edi
  call   <get_mtx_index@plt>
  cltq
  shl    $0x4,%rax
  lea    (%r12,%rax,1),%rdx
  fldt   0x0(%r13,%rax,1)
  fldt   (%r14,%rax,1)
  fsubrp %st,%st(1)
  mov    0x10(%rsp),%rax
  fldt   (%rax)
  fldt   0x30(%rsp)
  fmulp  %st,%st(1)
  fdivrp %st,%st(1)
  fldt   (%rdx)
  faddp  %st,%st(1)
  fldz
  fcomi  %st(1),%st
  jbe    L51
  fstp   %st(1)
  jmp    L378
L422:
  mov    (%rsp),%ecx
  lea    0x1(%rcx),%eax
  addq   $0x10,0x10(%rsp)
  cmp    %ecx,0x2c(%rsp)
  je     L350
  mov    %eax,(%rsp)
L136:
  mov    $0x0,%ebp
  test   %ebx,%ebx
  jg     L79
  jmp    L422
L366:
  mov    $0x0,%r13d
L171:
  mov    %ebp,%edx
  mov    %r13d,%esi
  mov    %r12d,%edi
  call   <get_mtx_index@plt>
  cltq
  shl    $0x4,%rax
  add    %r15,%rax
  fldt   (%rax)
  fldt   (%rsp)
  fdivrp %st,%st(1)
  fstpt  (%rax)
  mov    %r13d,%eax
  add    $0x1,%r13d
  cmp    %eax,%r14d
  jne    L171
L392:
  lea    0x1(%r12),%eax
  cmp    %r12d,0x2c(%rsp)
  je     L433
  mov    %eax,%r12d
L327:
  test   %ebx,%ebx
  jle    L392
  fldz
  fstpt  (%rsp)
  mov    $0x0,%ebp
L345:
  mov    %ebx,%edx
  mov    %ebp,%esi
  mov    %r12d,%edi
  call   <get_mtx_index@plt>
  cltq
  shl    $0x4,%rax
  fldt   (%r15,%rax,1)
  fldt   (%rsp)
  faddp  %st,%st(1)
  fstpt  (%rsp)
  mov    %ebp,%r14d
  add    $0x1,%ebp
  cmp    %ebp,%ebx
  jne    L345
  fldz
  fldt   (%rsp)
  fucomip %st(1),%st
  fstp   %st(0)
  jp     L366
  je     L392
  jmp    L366
L350:
  mov    $0x1,%r12d
  jmp    L327
L329:
  fldt   0x10(%rsp)
  fmuls  0xb95(%rip)        # 2000 <_fini+0xb64>
  fstpt  0x30(%rsp)
  mov    0x100(%rsp),%rax
  add    $0x10,%rax
  mov    %rax,0x10(%rsp)
  movl   $0x1,(%rsp)
  jmp    L136
L433:
  add    $0x48,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
```

assistant: ```c
void calculate_E_discriminative_contributions_multi(long double *E, long double *E_2, long double *E_3, long double *E_4, long double *E_num, long double *E_num_2, long double *E_num_3, long double *E_num_4, long double *E_den, long double *E_den_2, long double *E_den_3, long double *E_den_4, long double *emissions, long double *emissions_2, long double *emissions_3, long double *emissions_4, long double *transitions, int nr_v, int a_size, int a_size_2, int a_size_3, int a_size_4, long double *emiss_prior_scalers, long double *emiss_prior_scalers_2, long double *emiss_prior_scalers_3, long double *emiss_prior_scalers_4, int rd, int nr_alphabets, int opt_alpha) {
  int v, w;
  int a;
  int x, y, y_2, y_3, y_4;
  long double rowsum, dist_tot;
  long double E_divider, E_divider_2, E_divider_3, E_divider_4, max_T_den;
  long double max_E_den, max_E_den_2, max_E_den_3, max_E_den_4;
  long double E_limiter, E_limiter_2, E_limiter_3, E_limiter_4, T_limiter;
  static long double DIVIDER_SCALER = 10.0;
  long double *E_cur, *E_cur_num, *E_cur_den, *emissions_cur;
  int a_size_cur;
  if (opt_alpha == 1) {
    E_cur = E;
    E_cur_num = E_num;
    E_cur_den = E_den;
    emissions_cur = emissions;
    a_size_cur = a_size;
  }
  if (opt_alpha == 2) {
    E_cur = E_2;
    E_cur_num = E_num_2;
    E_cur_den = E_den_2;
    emissions_cur = emissions_2;
    a_size_cur = a_size_2;
  }
  if (opt_alpha == 1) {
    E_cur = E_3;
    E_cur_num = E_num_3;
    E_cur_den = E_den_3;
    emissions_cur = emissions_3;
    a_size_cur = a_size_3;
  }
  if (opt_alpha == 1) {
    E_cur = E_4;
    E_cur_num = E_num_4;
    E_cur_den = E_den_4;
    emissions_cur = emissions_4;
    a_size_cur = a_size_4;
  }
  for (v = 1; v < nr_v - 1; v++) {
    for (a = 0; a < a_size_cur; a++) {
      y = get_mtx_index(v, a, a_size_cur);
      *(E_cur + y) = *(emissions_cur + y);
    }
  }
  for (v = 1; v < nr_v - 1; v++) {
    dist_tot = 0.0;
    for (a = 0; a < a_size_cur; a++) {
      y = get_mtx_index(v, a, a_size_cur);
      dist_tot += *(E_cur_den + y);
    }
    if (dist_tot > 0.0) {
      for (a = 0; a < a_size_cur; a++) {
        y = get_mtx_index(v, a, a_size_cur);
      }
    }
    dist_tot = 0.0;
    for (a = 0; a < a_size_cur; a++) {
      y = get_mtx_index(v, a, a_size_cur);
      dist_tot += *(E_cur_num + y);
    }
    if (dist_tot > 0.0) {
      for (a = 0; a < a_size_cur; a++) {
        y = get_mtx_index(v, a, a_size_cur);
      }
    }
  }
  E_divider = 1.0;
  for (v = 1; v < nr_v - 1; v++) {
    for (a = 0; a < a_size_cur; a++) {
      y = get_mtx_index(v, a, a_size_cur);
      E_limiter = *(E_cur + y);
      if (*(E_cur + y) > (1.0 - *(E_cur + y))) {
        E_limiter = 1.0 - *(E_cur + y);
      }
      if (*(E_cur + y) != 0.0 && (*(E_cur_den + y) - *(E_cur_num + y)) / E_limiter > E_divider) {
        E_divider = (*(E_cur_den + y) - *(E_cur_num + y)) / E_limiter;
      }
    }
  }
  E_divider = E_divider * DIVIDER_SCALER;
  for (v = 1; v < nr_v - 1; v++) {
    for (a = 0; a < a_size_cur; a++) {
      y = get_mtx_index(v, a, a_size_cur);
      *(E_cur + y) += (*(E_cur_num + y) - *(E_cur_den + y)) / (E_divider * *(emiss_prior_scalers + v));
      if (*(E_cur + y) < 0.0) {
        *(E_cur + y) = 0.0;
      }
    }
  }
  for (v = 1; v < nr_v - 1; v++) {
    rowsum = 0.0;
    for (a = 0; a < a_size_cur; a++) {
      y = get_mtx_index(v, a, a_size_cur);
      rowsum += *(emissions_cur + y);
    }
    if (rowsum != 0.0) {
      for (a = 0; a < a_size_cur; a++) {
        y = get_mtx_index(v, a, a_size_cur);
        *(emissions_cur + y) = *(emissions_cur + y) / rowsum;
      }
    }
  }
}
```