user: 请从给定的汇编指令推导出C源代码：

```asm
<foo_div>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x20,%rsp
  mov    %edi,-0x14(%rbp)
  mov    %esi,-0x18(%rbp)
  cmpl   $0x0,-0x14(%rbp)
  jns    L349
  cmpl   $0x0,-0x18(%rbp)
  jle    L349
  mov    -0x14(%rbp),%eax
  cltd
  idivl  -0x18(%rbp)
  mov    %eax,-0x4(%rbp)
  cmpl   $0xffffffff,-0x4(%rbp)
  jne    L46
  mov    $0x0,%eax
  call   <abort@plt>
L46:
  mov    -0x4(%rbp),%eax
  jmp    L218
L349:
  cmpl   $0xffffffec,-0x14(%rbp)
  jl     L145
  cmpl   $0xfffffff7,-0x14(%rbp)
  jge    L145
  cmpl   $0x1,-0x18(%rbp)
  jle    L145
  cmpl   $0xa,-0x18(%rbp)
  jg     L145
  mov    -0x14(%rbp),%eax
  cltd
  idivl  -0x18(%rbp)
  mov    %eax,-0x4(%rbp)
  cmpl   $0xfffffff6,-0x4(%rbp)
  jge    L212
  mov    $0x0,%eax
  call   <link_error@plt>
L212:
  cmpl   $0x0,-0x4(%rbp)
  js     L89
  mov    $0x0,%eax
  call   <link_error@plt>
L89:
  mov    -0x4(%rbp),%eax
  jmp    L218
L145:
  cmpl   $0xffffffec,-0x14(%rbp)
  jl     L255
  cmpl   $0xfffffff7,-0x14(%rbp)
  jge    L255
  cmpl   $0xfffffff6,-0x18(%rbp)
  jl     L255
  cmpl   $0xffffffff,-0x18(%rbp)
  jge    L255
  mov    -0x14(%rbp),%eax
  cltd
  idivl  -0x18(%rbp)
  mov    %eax,-0x4(%rbp)
  cmpl   $0x0,-0x4(%rbp)
  jg     L143
  mov    $0x0,%eax
  call   <link_error@plt>
L143:
  cmpl   $0xa,-0x4(%rbp)
  jle    L403
  mov    $0x0,%eax
  call   <link_error@plt>
L403:
  mov    -0x4(%rbp),%eax
  jmp    L218
L255:
  cmpl   $0xffffffec,-0x14(%rbp)
  jl     L360
  cmpl   $0xa,-0x14(%rbp)
  jg     L360
  cmpl   $0x1,-0x18(%rbp)
  jle    L360
  cmpl   $0xa,-0x18(%rbp)
  jg     L360
  mov    -0x14(%rbp),%eax
  cltd
  idivl  -0x18(%rbp)
  mov    %eax,-0x4(%rbp)
  cmpl   $0xfffffff6,-0x4(%rbp)
  jge    L271
  mov    $0x0,%eax
  call   <link_error@plt>
L271:
  cmpl   $0x5,-0x4(%rbp)
  jle    L379
  mov    $0x0,%eax
  call   <link_error@plt>
L379:
  mov    -0x4(%rbp),%eax
  jmp    L218
L360:
  cmpl   $0xffffffec,-0x14(%rbp)
  jl     L288
  cmpl   $0xa,-0x14(%rbp)
  jg     L288
  cmpl   $0xfffffff6,-0x18(%rbp)
  jl     L288
  cmpl   $0xffffffff,-0x18(%rbp)
  jge    L288
  mov    -0x14(%rbp),%eax
  cltd
  idivl  -0x18(%rbp)
  mov    %eax,-0x4(%rbp)
  cmpl   $0xfffffffb,-0x4(%rbp)
  jge    L448
  mov    $0x0,%eax
  call   <link_error@plt>
L448:
  cmpl   $0xa,-0x4(%rbp)
  jle    L404
  mov    $0x0,%eax
  call   <link_error@plt>
L404:
  mov    -0x4(%rbp),%eax
  jmp    L218
L288:
  cmpl   $0x9,-0x14(%rbp)
  jle    L282
  cmpl   $0x14,-0x14(%rbp)
  jg     L282
  cmpl   $0x1,-0x18(%rbp)
  jle    L282
  cmpl   $0xa,-0x18(%rbp)
  jg     L282
  mov    -0x14(%rbp),%eax
  cltd
  idivl  -0x18(%rbp)
  mov    %eax,-0x4(%rbp)
  cmpl   $0x0,-0x4(%rbp)
  jg     L164
  mov    $0x0,%eax
  call   <link_error@plt>
L164:
  cmpl   $0xa,-0x4(%rbp)
  jle    L51
  mov    $0x0,%eax
  call   <link_error@plt>
L51:
  mov    -0x4(%rbp),%eax
  jmp    L218
L282:
  cmpl   $0x9,-0x14(%rbp)
  jle    L410
  cmpl   $0x14,-0x14(%rbp)
  jg     L410
  cmpl   $0xfffffff6,-0x18(%rbp)
  jl     L410
  cmpl   $0xffffffff,-0x18(%rbp)
  jge    L410
  mov    -0x14(%rbp),%eax
  cltd
  idivl  -0x18(%rbp)
  mov    %eax,-0x4(%rbp)
  cmpl   $0x0,-0x4(%rbp)
  js     L339
  mov    $0x0,%eax
  call   <link_error@plt>
L339:
  cmpl   $0xfffffff6,-0x4(%rbp)
  jge    L246
  mov    $0x0,%eax
  call   <link_error@plt>
L246:
  mov    -0x4(%rbp),%eax
  jmp    L218
L410:
  mov    $0x0,%eax
  call   <abort@plt>
L218:
  leave
  ret
```

assistant: ```c
foo_div(int i, int j) {
  int k;
  if (i <= -1)
    if (j >= 1) {
      k = i / j;
      if (k == -1)
        abort();
      return k;
    }
  if (i >= -20)
    if (i <= -10)
      if (j >= 2)
        if (j <= 10) {
          k = i / j;
          if (k < -10)
            link_error();
          if (k > -1)
            link_error();
          return k;
        }
  if (i >= -20)
    if (i <= -10)
      if (j >= -10)
        if (j <= -2) {
          k = i / j;
          if (k < 1)
            link_error();
          if (k > 10)
            link_error();
          return k;
        }
  if (i >= -20)
    if (i <= 10)
      if (j >= 2)
        if (j <= 10) {
          k = i / j;
          if (k < -10)
            link_error();
          if (k > 5)
            link_error();
          return k;
        }
  if (i >= -20)
    if (i <= 10)
      if (j >= -10)
        if (j <= -2) {
          k = i / j;
          if (k < -5)
            link_error();
          if (k > 10)
            link_error();
          return k;
        }
  if (i >= 10)
    if (i <= 20)
      if (j >= 2)
        if (j <= 10) {
          k = i / j;
          if (k < 1)
            link_error();
          if (k > 10)
            link_error();
          return k;
        }
  if (i >= 10)
    if (i <= 20)
      if (j >= -10)
        if (j <= -2) {
          k = i / j;
          if (k > -1)
            link_error();
          if (k < -10)
            link_error();
          return k;
        }
  abort();
}
```