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

```asm
<expint>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x70,%rsp
  mov    %edi,-0x64(%rbp)
  mov    %rsi,-0x70(%rbp)
  mov    -0x64(%rbp),%eax
  sub    $0x1,%eax
  mov    %eax,-0x4c(%rbp)
  cmpq   $0x1,-0x70(%rbp)
  jle    L52
  mov    -0x64(%rbp),%eax
  movslq %eax,%rdx
  mov    -0x70(%rbp),%rax
  add    %rdx,%rax
  mov    %rax,-0x48(%rbp)
  movq   $0x1e8480,-0x40(%rbp)
  movq   $0x1c9c380,-0x38(%rbp)
  mov    -0x38(%rbp),%rax
  mov    %rax,-0x20(%rbp)
  movl   $0x1,-0x54(%rbp)
  jmp    L51
L45:
  mov    -0x54(%rbp),%eax
  neg    %eax
  mov    %eax,%edx
  mov    -0x4c(%rbp),%ecx
  mov    -0x54(%rbp),%eax
  add    %ecx,%eax
  imul   %edx,%eax
  cltq
  mov    %rax,-0x8(%rbp)
  addq   $0x2,-0x48(%rbp)
  mov    -0x8(%rbp),%rax
  imul   -0x38(%rbp),%rax
  mov    %rax,%rdx
  mov    -0x48(%rbp),%rax
  add    %rax,%rdx
  mov    %rdx,%rax
  shl    $0x2,%rax
  add    %rdx,%rax
  add    %rax,%rax
  mov    %rax,-0x38(%rbp)
  mov    -0x8(%rbp),%rax
  cqto
  idivq  -0x40(%rbp)
  mov    %rax,%rdx
  mov    -0x48(%rbp),%rax
  add    %rdx,%rax
  mov    %rax,-0x40(%rbp)
  mov    -0x40(%rbp),%rax
  imul   -0x38(%rbp),%rax
  mov    %rax,-0x30(%rbp)
  mov    -0x20(%rbp),%rax
  imul   -0x30(%rbp),%rax
  mov    %rax,-0x20(%rbp)
  cmpq   $0x270f,-0x30(%rbp)
  jg     L65
  mov    -0x70(%rbp),%rax
  neg    %rax
  mov    %rax,%rdx
  mov    -0x20(%rbp),%rax
  imul   %rdx,%rax
  mov    %rax,-0x10(%rbp)
  mov    -0x10(%rbp),%rax
  jmp    L120
L65:
  addl   $0x1,-0x54(%rbp)
L51:
  cmpl   $0x64,-0x54(%rbp)
  jle    L45
  jmp    L33
L52:
  cmpl   $0x0,-0x4c(%rbp)
  je     L56
  mov    $0x2,%eax
  jmp    L58
L56:
  mov    $0x3e8,%eax
L58:
  mov    %rax,-0x10(%rbp)
  movq   $0x1,-0x28(%rbp)
  movl   $0x1,-0x54(%rbp)
  jmp    L42
L21:
  mov    -0x70(%rbp),%rax
  neg    %rax
  mov    -0x54(%rbp),%edx
  movslq %edx,%rsi
  cqto
  idiv   %rsi
  mov    %rax,%rdx
  mov    -0x28(%rbp),%rax
  imul   %rdx,%rax
  mov    %rax,-0x28(%rbp)
  mov    -0x54(%rbp),%eax
  cmp    -0x4c(%rbp),%eax
  je     L4
  mov    -0x28(%rbp),%rax
  neg    %rax
  mov    %rax,%rcx
  mov    -0x54(%rbp),%eax
  sub    -0x4c(%rbp),%eax
  movslq %eax,%rdi
  mov    %rcx,%rax
  cqto
  idiv   %rdi
  mov    %rax,-0x30(%rbp)
  jmp    L84
L4:
  movq   $0xff,-0x18(%rbp)
  movl   $0x1,-0x50(%rbp)
  jmp    L87
L88:
  mov    -0x50(%rbp),%edx
  mov    -0x4c(%rbp),%eax
  add    %edx,%eax
  cltq
  add    %rax,-0x18(%rbp)
  addl   $0x1,-0x50(%rbp)
L87:
  mov    -0x50(%rbp),%eax
  cmp    -0x4c(%rbp),%eax
  jle    L88
  mov    -0x70(%rbp),%rax
  mov    %rax,%rdi
  call   <foo@plt>
  imul   -0x28(%rbp),%rax
  mov    %rax,%rdx
  mov    -0x18(%rbp),%rax
  add    %rdx,%rax
  mov    %rax,-0x30(%rbp)
L84:
  mov    -0x30(%rbp),%rax
  add    %rax,-0x10(%rbp)
  addl   $0x1,-0x54(%rbp)
L42:
  cmpl   $0x64,-0x54(%rbp)
  jle    L21
L33:
  mov    -0x10(%rbp),%rax
L120:
  leave
  ret
```

assistant: ```c
long int expint(int n, long int x) {
  int i, ii, nm1;
  long int a, b, c, d, del, fact, h, psi, ans;
  nm1 = n - 1;
  if (x > 1) {
    b = x + n;
    c = 2e6;
    d = 3e7;
    h = d;
    for (i = 1; i <= 100; i++) {
      a = -i * (nm1 + i);
      b += 2;
      d = 10 * (a * d + b);
      c = b + a / c;
      del = c * d;
      h *= del;
      if (del < 10000) {
        ans = h * -x;
        return ans;
      }
    }
  } else {
    ans = nm1 != 0 ? 2 : 1000;
    fact = 1;
    for (i = 1; i <= 100; i++) {
      fact *= -x / i;
      if (i != nm1)
        del = -fact / (i - nm1);
      else {
        psi = 0x00FF;
        for (ii = 1; ii <= nm1; ii++)
          psi += ii + nm1;
        del = psi + fact * foo(x);
      }
      ans += del;
    }
  }
  return ans;
}
```