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

```asm
<main>:
  endbr64
  push   %r15
  lea    D287(%rip),%r15
  push   %r14
  lea    D15(%rip),%r14
  push   %r13
  lea    D301(%rip),%r13
  push   %r12
  lea    D141(%rip),%r12
  push   %rbp
  push   %rbx
  lea    D274(%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)
L162:
  xor    %eax,%eax
  mov    %rbp,%rsi
  mov    %rbx,%rdi
  call   <scanf@plt>
  test   %rax,%rax
  je     L41
  cmpb   $0x71,0x43(%rsp)
  je     L41
L76:
  xor    %eax,%eax
  call   <getchar@plt>
  cmp    $0xa,%al
  jne    L76
  movzbl 0x43(%rsp),%eax
  cmp    $0x62,%al
  je     L116
  cmp    $0x63,%al
  je     L103
  cmp    $0x61,%al
  je     L118
  mov    %r13,%rdi
  call   <puts@plt>
  jmp    L162
  nopl   0x0(%rax,%rax,1)
L116:
  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)
L108:
  xor    %eax,%eax
  call   <getchar@plt>
  cmp    $0xa,%al
  jne    L108
  xor    %eax,%eax
  call   <menu@plt>
  jmp    L162
  nopw   0x0(%rax,%rax,1)
L118:
  lea    D188(%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    L108
  nop
L103:
  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    L108
  nopl   0x0(%rax,%rax,1)
L41:
  movss  0xc(%rsp),%xmm9
  pxor   %xmm7,%xmm7
  pxor   %xmm6,%xmm6
  movss  0x10(%rsp),%xmm0
  movss  D197(%rip),%xmm4
  movsd  D317(%rip),%xmm1
  cvtss2sd 0x10(%rsp),%xmm7
  movapd %xmm7,%xmm5
  addss  %xmm9,%xmm0
  movss  0x14(%rsp),%xmm10
  movsd  D18(%rip),%xmm3
  movss  D302(%rip),%xmm8
  mulss  %xmm9,%xmm4
  movss  D260(%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     L66
  movss  D22(%rip),%xmm8
  comiss %xmm0,%xmm8
  jbe    L90
  movss  D111(%rip),%xmm0
  movss  %xmm0,0x10(%rsp)
L66:
  comiss D74(%rip),%xmm2
  jbe    L21
  movsd  D223(%rip),%xmm0
  pxor   %xmm8,%xmm8
  cvtss2sd %xmm2,%xmm8
  mulsd  %xmm8,%xmm0
  cvtsd2ss %xmm0,%xmm0
  movss  %xmm0,0x14(%rsp)
L96:
  lea    D201(%rip),%rbp
  movss  %xmm2,0x34(%rsp)
  lea    D304(%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    D129(%rip),%rdi
  call   <puts@plt>
  mov    D317(%rip),%rax
  movsd  D76(%rip),%xmm0
  mov    %r12,%rdi
  movq   %rax,%xmm1
  mov    $0x2,%eax
  call   <printf@plt>
  mov    D18(%rip),%rax
  lea    D202(%rip),%rdi
  movq   %rax,%xmm0
  mov    $0x1,%eax
  call   <printf@plt>
  lea    D60(%rip),%rdi
  call   <puts@plt>
  movsd  0x18(%rsp),%xmm7
  pxor   %xmm0,%xmm0
  lea    D296(%rip),%rdi
  mov    $0x2,%eax
  cvtss2sd 0xc(%rsp),%xmm0
  movapd %xmm7,%xmm1
  call   <printf@plt>
  movsd  0x20(%rsp),%xmm6
  mov    $0x1,%eax
  lea    D203(%rip),%rdi
  movapd %xmm6,%xmm0
  call   <printf@plt>
  lea    D150(%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    D25(%rip),%rdi
  pxor   %xmm0,%xmm0
  mov    $0x2,%eax
  movapd %xmm8,%xmm1
  cvtss2sd %xmm3,%xmm0
  call   <printf@plt>
  lea    D56(%rip),%rdi
  pxor   %xmm0,%xmm0
  mov    $0x1,%eax
  cvtss2sd 0x14(%rsp),%xmm0
  call   <printf@plt>
  lea    D267(%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    D199(%rip),%rdi
  cvtss2sd %xmm2,%xmm0
  call   <printf@plt>
  mov    %rbp,%rdi
  call   <puts@plt>
  mov    0x48(%rsp),%rax
  sub    %fs:0x28,%rax
  jne    L107
  add    $0x58,%rsp
  xor    %eax,%eax
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
L21:
  pxor   %xmm8,%xmm8
  movl   $0x0,0x14(%rsp)
  cvtss2sd %xmm2,%xmm8
  jmp    L96
L90:
  subss  %xmm8,%xmm0
  cvtss2sd %xmm0,%xmm0
  mulsd  D164(%rip),%xmm0
  addsd  D114(%rip),%xmm0
  cvtsd2ss %xmm0,%xmm0
  movss  %xmm0,0x10(%rsp)
  jmp    L66
L107:
  call   <__stack_chk_fail@plt>
```

tool_calls: name: unpack_data
arguments: data_label: D287
type_infered: string
name: unpack_data
arguments: data_label: D15
type_infered: string
name: unpack_data
arguments: data_label: D301
type_infered: string
name: unpack_data
arguments: data_label: D141
type_infered: string
name: unpack_data
arguments: data_label: D274
type_infered: string
name: unpack_data
arguments: data_label: D188
type_infered: string
name: unpack_data
arguments: data_label: D197
type_infered: f32
name: unpack_data
arguments: data_label: D317
type_infered: f64
name: unpack_data
arguments: data_label: D18
type_infered: f64
name: unpack_data
arguments: data_label: D302
type_infered: f32
name: unpack_data
arguments: data_label: D260
type_infered: f32
name: unpack_data
arguments: data_label: D22
type_infered: f32
name: unpack_data
arguments: data_label: D111
type_infered: f32
name: unpack_data
arguments: data_label: D74
type_infered: f32
name: unpack_data
arguments: data_label: D223
type_infered: f64
name: unpack_data
arguments: data_label: D201
type_infered: string
name: unpack_data
arguments: data_label: D304
type_infered: string
name: unpack_data
arguments: data_label: D129
type_infered: string
name: unpack_data
arguments: data_label: D76
type_infered: f32[2]
name: unpack_data
arguments: data_label: D202
type_infered: string
name: unpack_data
arguments: data_label: D60
type_infered: string
name: unpack_data
arguments: data_label: D296
type_infered: string
name: unpack_data
arguments: data_label: D203
type_infered: string
name: unpack_data
arguments: data_label: D150
type_infered: string
name: unpack_data
arguments: data_label: D25
type_infered: string
name: unpack_data
arguments: data_label: D56
type_infered: string
name: unpack_data
arguments: data_label: D267
type_infered: string
name: unpack_data
arguments: data_label: D199
type_infered: string
name: unpack_data
arguments: data_label: D164
type_infered: f64
name: unpack_data
arguments: data_label: D114
type_infered: f64

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

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

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

tool: D141: %f

tool: D274: %c

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

tool: D197: 1.25

tool: D317: 0.65

tool: D18: 0.89

tool: D302: 5

tool: D260: 3.5

tool: D22: 20

tool: D111: 10

tool: D74: 100

tool: D223: 0.05

tool: D201: 
***********************************


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


tool: D129: Unit price:

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

tool: D202: Carrot: $%.2f



tool: D60: Weight ordered:

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


tool: D203: Carrot: %.2f



tool: D150: Order price:

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



tool: D56: Discount: $%.2f


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



tool: D199: Total: $%.2f


tool: D164: 0.1

tool: D114: 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;
}
```