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

```asm
<main>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x30,%rsp
  mov    %fs:0x28,%rax
  mov    %rax,-0x8(%rbp)
  xor    %eax,%eax
  mov    $0x2,%edi
  call   <stack_create@plt>
  mov    %rax,-0x18(%rbp)
  movl   $0x0,-0x24(%rbp)
  jmp    L156
L83:
  lea    -0xa(%rbp),%rax
  mov    %rax,%rsi
  lea    D25(%rip),%rax
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <scanf@plt>
  cmp    $0x1,%eax
  jne    L0
  movzbl -0xa(%rbp),%eax
  cmp    $0x3d,%al
  je     L103
  mov    -0x18(%rbp),%rax
  mov    %rax,%rdi
  call   <stack_pop@plt>
  mov    %eax,-0x20(%rbp)
  mov    -0x18(%rbp),%rax
  mov    %rax,%rdi
  call   <stack_pop@plt>
  mov    %eax,-0x1c(%rbp)
  movzbl -0xa(%rbp),%eax
  movsbl %al,%eax
  cmp    $0x2f,%eax
  je     L184
  cmp    $0x2f,%eax
  jg     L4
  cmp    $0x2d,%eax
  je     L23
  cmp    $0x2d,%eax
  jg     L4
  cmp    $0x2a,%eax
  je     L32
  cmp    $0x2b,%eax
  jne    L4
  mov    -0x1c(%rbp),%edx
  mov    -0x20(%rbp),%eax
  add    %eax,%edx
  mov    -0x18(%rbp),%rax
  mov    %edx,%esi
  mov    %rax,%rdi
  call   <stack_push@plt>
  jmp    L156
L23:
  mov    -0x1c(%rbp),%eax
  sub    -0x20(%rbp),%eax
  mov    %eax,%edx
  mov    -0x18(%rbp),%rax
  mov    %edx,%esi
  mov    %rax,%rdi
  call   <stack_push@plt>
  jmp    L156
L32:
  mov    -0x1c(%rbp),%eax
  imul   -0x20(%rbp),%eax
  mov    %eax,%edx
  mov    -0x18(%rbp),%rax
  mov    %edx,%esi
  mov    %rax,%rdi
  call   <stack_push@plt>
  jmp    L156
L184:
  mov    -0x1c(%rbp),%eax
  cltd
  idivl  -0x20(%rbp)
  mov    %eax,%edx
  mov    -0x18(%rbp),%rax
  mov    %edx,%esi
  mov    %rax,%rdi
  call   <stack_push@plt>
  jmp    L156
L4:
  mov    $0x0,%eax
  call   <abort@plt>
  jmp    L156
L0:
  lea    -0x28(%rbp),%rax
  mov    %rax,%rsi
  lea    D7(%rip),%rax
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <scanf@plt>
  cmp    $0x1,%eax
  jne    L186
  mov    -0x28(%rbp),%edx
  mov    -0x18(%rbp),%rax
  mov    %edx,%esi
  mov    %rax,%rdi
  call   <stack_push@plt>
  jmp    L156
L186:
  mov    $0x0,%eax
  call   <abort@plt>
L156:
  cmpl   $0x0,-0x24(%rbp)
  je     L83
  jmp    L42
L103:
  nop
L42:
  mov    -0x18(%rbp),%rax
  mov    %rax,%rdi
  call   <stack_size@plt>
  cmp    $0x1,%eax
  sete   %al
  movzbl %al,%eax
  mov    %eax,%edi
  call   <assert@plt>
  mov    -0x18(%rbp),%rax
  mov    %rax,%rdi
  call   <stack_pop@plt>
  mov    %eax,%esi
  lea    D20(%rip),%rax
  mov    %rax,%rdi
  call   <printf@plt>
  mov    -0x18(%rbp),%rax
  mov    %rax,%rdi
  call   <stack_destroy@plt>
  mov    $0x0,%eax
  mov    -0x8(%rbp),%rdx
  sub    %fs:0x28,%rdx
  je     L57
  call   <__stack_chk_fail@plt>
L57:
  leave
  ret
```

tool_calls: name: parse_data
arguments: tag: D25
type: string
name: parse_data
arguments: tag: D7
type: string
name: parse_data
arguments: tag: D20
type: string

tool: D25:  %1[+-/*=] 

tool: D7:  %d 

tool: D20: %d


assistant: ```c
int main() {
  struct Stack *s = stack_create(2);
  int end = 0;
  while (!end) {
    int value;
    char op[2];
    if (scanf(" %1[+-/*=] ", op) == 1) {
      if (op[0] == '=') {
        break;
      } else {
        int o1 = stack_pop(s), o2 = stack_pop(s);
        switch (op[0]) {
        case '+':
          stack_push(s, o2 + o1);
          break;
        case '-':
          stack_push(s, o2 - o1);
          break;
        case '*':
          stack_push(s, o2 * o1);
          break;
        case '/':
          stack_push(s, o2 / o1);
          break;
        default:
          abort();
        }
      }
    } else if (scanf(" %d ", &value) == 1) {
      stack_push(s, value);
    } else {
      abort();
    }
  }
  assert(stack_size(s) == 1);
  printf("%d\n", stack_pop(s));
  stack_destroy(s);
}
```