user: 下面的汇编指令对应的C源代码是什么：

```asm
<ExprEval>:
  endbr64
  push   %r15
  push   %r14
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  sub    $0x18,%rsp
  mov    %rsi,0x8(%rsp)
  test   %rdi,%rdi
  je     L144
  movl   $0x0,(%rsp)
  mov    %rdi,%r14
  mov    %edx,%ebp
  lea    0x1(%rdi),%r15
  xor    %r13d,%r13d
  xor    %ebx,%ebx
  jmp    L118
  nopw   0x0(%rax,%rax,1)
L40:
  cmp    $0x2f,%dl
  ja     L136
  movabs $0xac2000000000,%rax
  bt     %rdx,%rax
  jb     L19
L136:
  movsbl %dl,%edi
  call   <isdigit@plt>
  test   %eax,%eax
  je     L62
L105:
  add    $0x1,%r15
L118:
  movzbl -0x1(%r15),%edx
  test   %dl,%dl
  je     L107
  test   %ebp,%ebp
  jne    L89
L65:
  cmp    $0x2c,%dl
  jne    L40
  mov    (%rsp),%eax
  test   %eax,%eax
  je     L124
L168:
  movl   $0x1,(%rsp)
  mov    %r15,%r14
  jmp    L105
  cs nopw 0x0(%rax,%rax,1)
L89:
  mov    %ebx,%edx
  mov    %r13d,%ecx
  lea    D18(%rip),%rdi
  mov    %r12d,%esi
  call   <printf@plt>
  movzbl -0x1(%r15),%edx
  jmp    L65
  nopl   0x0(%rax,%rax,1)
L19:
  movb   $0x0,-0x1(%r15)
  mov    %r14,%rdi
  mov    %dl,0x7(%rsp)
  call   <atoi@plt>
  movzbl 0x7(%rsp),%edx
  mov    %eax,%ebx
  sub    $0x25,%edx
  cmp    $0xa,%dl
  ja     L161
  lea    D9(%rip),%rcx
  movzbl %dl,%edx
  movslq (%rcx,%rdx,4),%rax
  add    %rcx,%rax
  notrack jmp *%rax
  nopl   0x0(%rax)
  imul   %ebx,%r12d
  mov    %r12d,%r13d
L161:
  mov    %r13d,%r12d
  mov    %r15,%r14
  jmp    L105
  nopw   0x0(%rax,%rax,1)
  mov    %r12d,%eax
  mov    %r15,%r14
  cltd
  idiv   %ebx
  mov    %eax,%r13d
  mov    %r13d,%r12d
  jmp    L105
  nopl   0x0(%rax)
  mov    %r12d,%r13d
  mov    %r15,%r14
  sub    %ebx,%r13d
  mov    %r13d,%r12d
  jmp    L105
  nopl   0x0(%rax)
  lea    (%rbx,%r12,1),%r13d
  mov    %r15,%r14
  mov    %r13d,%r12d
  jmp    L105
  nop
  mov    %r12d,%eax
  mov    %r15,%r14
  cltd
  idiv   %ebx
  mov    %edx,%r13d
  mov    %r13d,%r12d
  jmp    L105
  nopl   0x0(%rax)
L124:
  movb   $0x0,-0x1(%r15)
  mov    %r14,%rdi
  call   <atoi@plt>
  mov    %eax,%r12d
  jmp    L168
L144:
  xor    %r13d,%r13d
L107:
  mov    0x8(%rsp),%rax
  mov    %r13d,(%rax)
  add    $0x18,%rsp
  xor    %eax,%eax
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
  nopl   0x0(%rax)
L62:
  add    $0x18,%rsp
  mov    $0x1,%eax
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
```

tool_calls: name: extract_symbolic_data
arguments: tag: D18
data_type: string

tool: D18: DEBUG: lv=%d rv=%d acc=%d


assistant: ```c
int ExprEval(char *expr, int *rtn, int debug) {
  char *pe = expr;
  char *ps = expr;
  int lv, rv, acc = (0, 0, 0);
  int flagLV = 0;
  int rc = 0;
  rv = 0;
  while (pe != NULL && *pe != '\000') {
    if (debug != 0) {
      printf("DEBUG: lv=%d rv=%d acc=%d\n", lv, rv, acc);
    }
    if (*pe == ',') {
      if (flagLV == 0) {
        *pe = '\000';
        lv = atoi(ps);
        flagLV = 1;
      }
      ps = pe + 1;
    } else if (*pe == '+' || *pe == '-' || *pe == '/' || *pe == '*' || *pe == '%') {
      char op = *pe;
      *pe = '\000';
      rv = atoi(ps);
      switch (op) {
      case '*':
        acc = (lv * rv);
        break;
      case '+':
        acc = (lv + rv);
        break;
      case '-':
        acc = (lv - rv);
        break;
      case '/':
        acc = (lv / rv);
        break;
      case '%':
        acc = (lv % rv);
        break;
      }
      ps = pe + 1;
      lv = acc;
    } else if (!isdigit(*pe)) {
      return (1);
    }
    ++pe;
  }
  *rtn = acc;
  return (rc);
}
```