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

```asm
<main>:
  endbr64
  push   %r15
  lea    D290(%rip),%r15
  push   %r14
  lea    D115(%rip),%r14
  push   %r13
  lea    D50(%rip),%r13
  push   %r12
  lea    D286(%rip),%r12
  push   %rbp
  push   %rbx
  lea    D175(%rip),%rbx
  sub    $0x58,%rsp
  mov    %fs:0x28,%rax
  mov    %rax,0x48(%rsp)
  xor    %eax,%eax
  lea    0x43(%rsp),%rbp
  call   <menu@plt>
  movl   $0x0,0x14(%rsp)
  movl   $0x0,0x10(%rsp)
  movl   $0x0,0xc(%rsp)
  nopw   0x0(%rax,%rax,1)
L158:
  xor    %eax,%eax
  mov    %rbp,%rsi
  mov    %rbx,%rdi
  call   <scanf@plt>
  test   %rax,%rax
  je     L11
  cmpb   $0x71,0x43(%rsp)
  je     L11
L97:
  xor    %eax,%eax
  call   <getchar@plt>
  cmp    $0xa,%al
  jne    L97
  movzbl 0x43(%rsp),%eax
  cmp    $0x62,%al
  je     L128
  cmp    $0x63,%al
  je     L98
  cmp    $0x61,%al
  je     L77
  mov    %r13,%rdi
  call   <puts@plt>
  jmp    L158
  nopl   0x0(%rax,%rax,1)
L128:
  mov    %r15,%rdi
  call   <puts@plt>
  lea    0x44(%rsp),%rsi
  mov    %r12,%rdi
  xor    %eax,%eax
  call   <scanf@plt>
  movss  0x10(%rsp),%xmm6
  addss  0x44(%rsp),%xmm6
  movss  %xmm6,0x10(%rsp)
  nopl   0x0(%rax)
L59:
  xor    %eax,%eax
  call   <getchar@plt>
  cmp    $0xa,%al
  jne    L59
  xor    %eax,%eax
  call   <menu@plt>
  jmp    L158
  nopw   0x0(%rax,%rax,1)
L77:
  lea    D191(%rip),%rdi
  call   <puts@plt>
  lea    0x44(%rsp),%rsi
  mov    %r12,%rdi
  xor    %eax,%eax
  call   <scanf@plt>
  movss  0xc(%rsp),%xmm4
  addss  0x44(%rsp),%xmm4
  movss  %xmm4,0xc(%rsp)
  jmp    L59
  nop
L98:
  mov    %r14,%rdi
  call   <puts@plt>
  lea    0x44(%rsp),%rsi
  mov    %r12,%rdi
  xor    %eax,%eax
  call   <scanf@plt>
  movss  0x14(%rsp),%xmm7
  addss  0x44(%rsp),%xmm7
  movss  %xmm7,0x14(%rsp)
  jmp    L59
  nopl   0x0(%rax,%rax,1)
L11:
  movss  0xc(%rsp),%xmm9
  pxor   %xmm7,%xmm7
  pxor   %xmm6,%xmm6
  movss  0x10(%rsp),%xmm0
  movss  D238(%rip),%xmm4
  movsd  D271(%rip),%xmm1
  cvtss2sd 0x10(%rsp),%xmm7
  movapd %xmm7,%xmm5
  addss  %xmm9,%xmm0
  movss  0x14(%rsp),%xmm10
  movsd  D172(%rip),%xmm3
  movss  D218(%rip),%xmm8
  mulss  %xmm9,%xmm4
  movss  D265(%rip),%xmm11
  mulsd  %xmm1,%xmm5
  cvtss2sd %xmm10,%xmm6
  addss  %xmm10,%xmm0
  mulsd  %xmm6,%xmm3
  movss  %xmm11,0x10(%rsp)
  movaps %xmm4,%xmm2
  comiss %xmm0,%xmm8
  cvtsd2ss %xmm5,%xmm5
  addss  %xmm5,%xmm2
  cvtsd2ss %xmm3,%xmm3
  addss  %xmm3,%xmm2
  ja     L81
  movss  D78(%rip),%xmm8
  comiss %xmm0,%xmm8
  jbe    L161
  movss  D156(%rip),%xmm0
  movss  %xmm0,0x10(%rsp)
L81:
  comiss D104(%rip),%xmm2
  jbe    L101
  movsd  D131(%rip),%xmm0
  pxor   %xmm8,%xmm8
  cvtss2sd %xmm2,%xmm8
  mulsd  %xmm8,%xmm0
  cvtsd2ss %xmm0,%xmm0
  movss  %xmm0,0x14(%rsp)
L135:
  lea    D33(%rip),%rbp
  movss  %xmm2,0x34(%rsp)
  lea    D27(%rip),%r12
  mov    %rbp,%rdi
  movsd  %xmm8,0x38(%rsp)
  movss  %xmm3,0x30(%rsp)
  movss  %xmm5,0x2c(%rsp)
  movss  %xmm4,0x28(%rsp)
  movsd  %xmm6,0x20(%rsp)
  movsd  %xmm7,0x18(%rsp)
  call   <puts@plt>
  lea    D236(%rip),%rdi
  call   <puts@plt>
  mov    D271(%rip),%rax
  movsd  D249(%rip),%xmm0
  mov    %r12,%rdi
  movq   %rax,%xmm1
  mov    $0x2,%eax
  call   <printf@plt>
  mov    D172(%rip),%rax
  lea    D15(%rip),%rdi
  movq   %rax,%xmm0
  mov    $0x1,%eax
  call   <printf@plt>
  lea    D262(%rip),%rdi
  call   <puts@plt>
  movsd  0x18(%rsp),%xmm7
  pxor   %xmm0,%xmm0
  lea    D76(%rip),%rdi
  mov    $0x2,%eax
  cvtss2sd 0xc(%rsp),%xmm0
  movapd %xmm7,%xmm1
  call   <printf@plt>
  movsd  0x20(%rsp),%xmm6
  mov    $0x1,%eax
  lea    D42(%rip),%rdi
  movapd %xmm6,%xmm0
  call   <printf@plt>
  lea    D72(%rip),%rdi
  call   <puts@plt>
  mov    %r12,%rdi
  pxor   %xmm0,%xmm0
  pxor   %xmm1,%xmm1
  movss  0x28(%rsp),%xmm4
  movss  0x2c(%rsp),%xmm5
  mov    $0x2,%eax
  cvtss2sd %xmm4,%xmm0
  cvtss2sd %xmm5,%xmm1
  call   <printf@plt>
  movsd  0x38(%rsp),%xmm8
  movss  0x30(%rsp),%xmm3
  lea    D215(%rip),%rdi
  pxor   %xmm0,%xmm0
  mov    $0x2,%eax
  movapd %xmm8,%xmm1
  cvtss2sd %xmm3,%xmm0
  call   <printf@plt>
  lea    D158(%rip),%rdi
  pxor   %xmm0,%xmm0
  mov    $0x1,%eax
  cvtss2sd 0x14(%rsp),%xmm0
  call   <printf@plt>
  lea    D64(%rip),%rdi
  pxor   %xmm0,%xmm0
  mov    $0x1,%eax
  cvtss2sd 0x10(%rsp),%xmm0
  call   <printf@plt>
  pxor   %xmm0,%xmm0
  movss  0x34(%rsp),%xmm2
  subss  0x14(%rsp),%xmm2
  addss  0x10(%rsp),%xmm2
  mov    $0x1,%eax
  lea    D12(%rip),%rdi
  cvtss2sd %xmm2,%xmm0
  call   <printf@plt>
  mov    %rbp,%rdi
  call   <puts@plt>
  mov    0x48(%rsp),%rax
  sub    %fs:0x28,%rax
  jne    L114
  add    $0x58,%rsp
  xor    %eax,%eax
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
L101:
  pxor   %xmm8,%xmm8
  movl   $0x0,0x14(%rsp)
  cvtss2sd %xmm2,%xmm8
  jmp    L135
L161:
  subss  %xmm8,%xmm0
  cvtss2sd %xmm0,%xmm0
  mulsd  D257(%rip),%xmm0
  addsd  D316(%rip),%xmm0
  cvtsd2ss %xmm0,%xmm0
  movss  %xmm0,0x10(%rsp)
  jmp    L81
L114:
  call   <__stack_chk_fail@plt>
```

tool_calls: name: parse_data
arguments: tag: D290
datatype: string
name: parse_data
arguments: tag: D115
datatype: string
name: parse_data
arguments: tag: D50
datatype: string
name: parse_data
arguments: tag: D286
datatype: string
name: parse_data
arguments: tag: D175
datatype: string
name: parse_data
arguments: tag: D191
datatype: string
name: parse_data
arguments: tag: D238
datatype: f32
name: parse_data
arguments: tag: D271
datatype: f64
name: parse_data
arguments: tag: D172
datatype: f64
name: parse_data
arguments: tag: D218
datatype: f32
name: parse_data
arguments: tag: D265
datatype: f32
name: parse_data
arguments: tag: D78
datatype: f32
name: parse_data
arguments: tag: D156
datatype: f32
name: parse_data
arguments: tag: D104
datatype: f32
name: parse_data
arguments: tag: D131
datatype: f64
name: parse_data
arguments: tag: D33
datatype: string
name: parse_data
arguments: tag: D27
datatype: string
name: parse_data
arguments: tag: D236
datatype: string
name: parse_data
arguments: tag: D249
datatype: f32[2]
name: parse_data
arguments: tag: D15
datatype: string
name: parse_data
arguments: tag: D262
datatype: string
name: parse_data
arguments: tag: D76
datatype: string
name: parse_data
arguments: tag: D42
datatype: string
name: parse_data
arguments: tag: D72
datatype: string
name: parse_data
arguments: tag: D215
datatype: string
name: parse_data
arguments: tag: D158
datatype: string
name: parse_data
arguments: tag: D64
datatype: string
name: parse_data
arguments: tag: D12
datatype: string
name: parse_data
arguments: tag: D257
datatype: f64
name: parse_data
arguments: tag: D316
datatype: f64

tool: D290: please enter the weight (in pound) of beet

tool: D115: please enter the weight (in pound) of carrot

tool: D50: No such option! Please enter a letter within the range a ~ c & q.

tool: D286: %f

tool: D175: %c

tool: D191: please enter the weight (in pound) of artichoke

tool: D238: 1.25

tool: D271: 0.65

tool: D172: 0.89

tool: D218: 5

tool: D265: 3.5

tool: D78: 20

tool: D156: 10

tool: D104: 100

tool: D131: 0.05

tool: D33: 
***********************************


tool: D27: Artichoke: $%.2f	Beet: $%.2f


tool: D236: Unit price:

tool: {"D249": [0.0,1.90625]}

tool: D15: Carrot: $%.2f



tool: D262: Weight ordered:

tool: D76: Artichoke: %.2f		Beet: %.2f


tool: D42: Carrot: %.2f



tool: D72: Order price:

tool: D215: Carrot: $%.2f		All: $%.2f



tool: D158: Discount: $%.2f


tool: D64: Transportation cost: $%.2f



tool: D12: Total: $%.2f


tool: D257: 0.1

tool: D316: 8

assistant: ```c
int main(void) {
  float weightA = 0, weightB = 0, weightC = 0;
  char type;
  menu();
  while (scanf("%c", &type) && type != 'q') {
    while (getchar() != '\n')
      continue;
    float addition;
    switch (type) {
    case 'a':
      printf("please enter the weight (in pound) of artichoke\n");
      scanf("%f", &addition);
      weightA += addition;
      break;
    case 'b':
      printf("please enter the weight (in pound) of beet\n");
      scanf("%f", &addition);
      weightB += addition;
      break;
    case 'c':
      printf("please enter the weight (in pound) of carrot\n");
      scanf("%f", &addition);
      weightC += addition;
      break;
    default:
      printf("No such option! Please enter a letter within the range a ~ c & q.\n");
      continue;
    }
    while (getchar() != '\n')
      continue;
    menu();
  }
  float costA = weightA * 1.25, costB = weightB * 0.65, costC = weightC * 0.89, costABC = costA + costB + costC, weight = weightA + weightB + weightC, costTrans = weight < 5 ? 3.5 : weight < 20 ? 10.0 : 8 + 0.1 * (weight - 20), discount = costABC > 100 ? 0.05 * costABC : 0, costT = costABC - discount + costTrans;
  printf("\n***********************************\n\n");
  printf("Unit price:\n");
  printf("Artichoke: $%.2f\tBeet: $%.2f\n", 1.25, 0.65);
  printf("Carrot: $%.2f\n\n", 0.89);
  printf("Weight ordered:\n");
  printf("Artichoke: %.2f\t\tBeet: %.2f\n", weightA, weightB);
  printf("Carrot: %.2f\n\n", weightC);
  printf("Order price:\n");
  printf("Artichoke: $%.2f\tBeet: $%.2f\n", costA, costB);
  printf("Carrot: $%.2f\t\tAll: $%.2f\n\n", costC, costABC);
  printf("Discount: $%.2f\n", discount);
  printf("Transportation cost: $%.2f\n\n", costTrans);
  printf("Total: $%.2f\n", costT);
  printf("\n***********************************\n\n");
  return 0;
}
```