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

```asm
<calculate_E_discriminative_contributions_multi>:
  endbr64
  push   %r15
  push   %r14
  push   %r13
  push   %r12
  mov    %r9,%r12
  push   %rbp
  mov    %rsi,%rbp
  push   %rbx
  sub    $0x38,%rsp
  cmpl   $0x1,0x120(%rsp)
  mov    0xa8(%rsp),%r14
  mov    0xd8(%rsp),%r15d
  jne    L137
  mov    0x98(%rsp),%rax
  mov    0xe8(%rsp),%r15d
  mov    %rcx,%rbp
  mov    0xb8(%rsp),%r14
  mov    0x78(%rsp),%r12
  mov    %rax,0x88(%rsp)
L137:
  mov    0xc8(%rsp),%eax
  mov    $0x1,%ebx
  sub    $0x1,%eax
  mov    %eax,0x2c(%rsp)
  cmp    $0x1,%eax
  jle    L2
  cs nopw 0x0(%rax,%rax,1)
L106:
  xor    %r13d,%r13d
  test   %r15d,%r15d
  jle    L151
  nopl   0x0(%rax,%rax,1)
L185:
  mov    %r13d,%esi
  mov    %r15d,%edx
  mov    %ebx,%edi
  add    $0x1,%r13d
  call   <get_mtx_index@plt>
  cltq
  shl    $0x4,%rax
  fldt   (%r14,%rax,1)
  fstpt  0x0(%rbp,%rax,1)
  cmp    %r13d,%r15d
  jne    L185
L151:
  add    $0x1,%ebx
  cmp    0x2c(%rsp),%ebx
  jne    L106
  mov    $0x1,%ebx
  nopw   0x0(%rax,%rax,1)
L49:
  test   %r15d,%r15d
  jle    L21
  fldz
  xor    %r13d,%r13d
  cs nopw 0x0(%rax,%rax,1)
L270:
  mov    %r13d,%esi
  mov    %r15d,%edx
  mov    %ebx,%edi
  fstpt  (%rsp)
  call   <get_mtx_index@plt>
  mov    0x88(%rsp),%rcx
  mov    %r13d,%r9d
  add    $0x1,%r13d
  cltq
  shl    $0x4,%rax
  fldt   (%rcx,%rax,1)
  fldt   (%rsp)
  faddp  %st,%st(1)
  cmp    %r13d,%r15d
  jne    L270
  fldz
  fxch   %st(1)
  fcomip %st(1),%st
  fstp   %st(0)
  ja     L136
L215:
  fldz
  xor    %ecx,%ecx
  nopl   0x0(%rax)
L269:
  mov    %ecx,%esi
  mov    %r15d,%edx
  mov    %ebx,%edi
  fstpt  0x10(%rsp)
  mov    %ecx,(%rsp)
  call   <get_mtx_index@plt>
  mov    (%rsp),%ecx
  cltq
  shl    $0x4,%rax
  add    $0x1,%ecx
  fldt   (%r12,%rax,1)
  fldt   0x10(%rsp)
  faddp  %st,%st(1)
  cmp    %ecx,%r15d
  jg     L269
  fldz
  fxch   %st(1)
  fcomip %st(1),%st
  fstp   %st(0)
  ja     L67
L21:
  add    $0x1,%ebx
  cmp    0x2c(%rsp),%ebx
  jne    L49
  fld1
  mov    $0x1,%r13d
  fstpt  (%rsp)
  nopl   0x0(%rax)
L148:
  xor    %ebx,%ebx
  test   %r15d,%r15d
  jle    L292
  nopw   0x0(%rax,%rax,1)
L86:
  mov    %r15d,%edx
  mov    %ebx,%esi
  mov    %r13d,%edi
  call   <get_mtx_index@plt>
  cltq
  shl    $0x4,%rax
  fldt   0x0(%rbp,%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     L220
  je     L41
L220:
  mov    0x88(%rsp),%rcx
  fldt   (%rcx,%rax,1)
  fldt   (%r12,%rax,1)
  fsubrp %st,%st(1)
  fdivp  %st,%st(1)
  fldt   (%rsp)
  fxch   %st(1)
  fucomi %st(1),%st
  fcmovbe %st(1),%st
  fstp   %st(1)
  fstpt  (%rsp)
  jmp    L170
  nopw   0x0(%rax,%rax,1)
L41:
  fstp   %st(0)
L170:
  add    $0x1,%ebx
  cmp    %ebx,%r15d
  jne    L86
L292:
  add    $0x1,%r13d
  cmp    0x2c(%rsp),%r13d
  jne    L148
  fldt   (%rsp)
  fmuls  0xcda(%rip)        # 2000 <_fini+0xb48>
  mov    $0x1,%r13d
  mov    0xf0(%rsp),%rax
  lea    0x10(%rax),%rbx
  fstpt  0x10(%rsp)
  nopl   0x0(%rax)
L120:
  xor    %esi,%esi
  test   %r15d,%r15d
  jle    L280
  nopw   0x0(%rax,%rax,1)
L61:
  mov    %r15d,%edx
  mov    %r13d,%edi
  mov    %esi,(%rsp)
  call   <get_mtx_index@plt>
  mov    0x88(%rsp),%rdi
  mov    (%rsp),%esi
  cltq
  shl    $0x4,%rax
  fldt   (%r12,%rax,1)
  lea    0x0(%rbp,%rax,1),%rdx
  fldt   (%rdi,%rax,1)
  fsubrp %st,%st(1)
  fldt   (%rbx)
  fldt   0x10(%rsp)
  fmulp  %st,%st(1)
  fdivrp %st,%st(1)
  fldt   (%rdx)
  faddp  %st,%st(1)
  fldz
  fucomi %st(1),%st
  fcmovbe %st(1),%st
  fstp   %st(1)
  add    $0x1,%esi
  fstpt  (%rdx)
  cmp    %esi,%r15d
  jne    L61
L280:
  add    $0x1,%r13d
  add    $0x10,%rbx
  cmp    0x2c(%rsp),%r13d
  jne    L120
  mov    $0x1,%ebx
  nopl   0x0(%rax)
L273:
  test   %r15d,%r15d
  jle    L199
  fldz
  xor    %ebp,%ebp
  fstpt  (%rsp)
  nopl   0x0(%rax)
L105:
  mov    %ebp,%esi
  mov    %r15d,%edx
  mov    %ebx,%edi
  mov    %ebp,%r12d
  call   <get_mtx_index@plt>
  add    $0x1,%ebp
  cltq
  shl    $0x4,%rax
  fldt   (%r14,%rax,1)
  fldt   (%rsp)
  faddp  %st,%st(1)
  fstpt  (%rsp)
  cmp    %ebp,%r15d
  jne    L105
  fldz
  fldt   (%rsp)
  fucomip %st(1),%st
  fstp   %st(0)
  jp     L279
  jne    L279
L199:
  add    $0x1,%ebx
  cmp    0x2c(%rsp),%ebx
  jne    L273
L2:
  add    $0x38,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
  nopw   0x0(%rax,%rax,1)
L136:
  xor    %esi,%esi
  nopw   0x0(%rax,%rax,1)
L84:
  mov    %r13d,%edx
  mov    %ebx,%edi
  mov    %r9d,0x10(%rsp)
  mov    %esi,(%rsp)
  call   <get_mtx_index@plt>
  mov    (%rsp),%esi
  mov    0x10(%rsp),%r9d
  mov    %esi,%eax
  add    $0x1,%esi
  cmp    %r9d,%eax
  jne    L84
  jmp    L215
  nopl   0x0(%rax)
L67:
  xor    %ecx,%ecx
  nopw   0x0(%rax,%rax,1)
L293:
  mov    %ecx,%esi
  mov    %r15d,%edx
  mov    %ebx,%edi
  mov    %ecx,(%rsp)
  call   <get_mtx_index@plt>
  mov    (%rsp),%ecx
  add    $0x1,%ecx
  cmp    %ecx,%r15d
  jg     L293
  jmp    L21
  nop
L279:
  xor    %r13d,%r13d
  nopl   0x0(%rax,%rax,1)
L297:
  mov    %r13d,%esi
  mov    %ebp,%edx
  mov    %ebx,%edi
  call   <get_mtx_index@plt>
  cltq
  shl    $0x4,%rax
  add    %r14,%rax
  fldt   (%rax)
  fldt   (%rsp)
  fdivrp %st,%st(1)
  fstpt  (%rax)
  mov    %r13d,%eax
  add    $0x1,%r13d
  cmp    %r12d,%eax
  jne    L297
  jmp    L199
```

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;
      }
    }
  }
}
```