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

```asm
<main>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x70,%rsp
  mov    %edi,-0x64(%rbp)
  mov    %rsi,-0x70(%rbp)
  mov    %fs:0x28,%rax
  mov    %rax,-0x8(%rbp)
  xor    %eax,%eax
  movl   $0x0,-0x5c(%rbp)
  lea    D145(%rip),%rax
  mov    %rax,%rdi
  call   <puts@plt>
  lea    D68(%rip),%rax
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  lea    -0x58(%rbp),%rax
  mov    %rax,%rsi
  lea    D44(%rip),%rax
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <scanf@plt>
  lea    D12(%rip),%rax
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  lea    -0x40(%rbp),%rax
  mov    %rax,%rsi
  lea    D44(%rip),%rax
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <scanf@plt>
  lea    D28(%rip),%rax
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  lea    -0x50(%rbp),%rax
  mov    %rax,%rsi
  lea    D44(%rip),%rax
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <scanf@plt>
  lea    D169(%rip),%rax
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  lea    -0x38(%rbp),%rax
  mov    %rax,%rsi
  lea    D44(%rip),%rax
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <scanf@plt>
  lea    D35(%rip),%rax
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  lea    -0x48(%rbp),%rax
  mov    %rax,%rsi
  lea    D44(%rip),%rax
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <scanf@plt>
  lea    D144(%rip),%rax
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  lea    -0x30(%rbp),%rax
  mov    %rax,%rsi
  lea    D44(%rip),%rax
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <scanf@plt>
  lea    D20(%rip),%rax
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  lea    -0x60(%rbp),%rax
  mov    %rax,%rsi
  lea    D83(%rip),%rax
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <scanf@plt>
  mov    $0x0,%edi
  call   <time@plt>
  mov    %eax,%edi
  call   <srand@plt>
  movl   $0x0,-0x5c(%rbp)
  jmp    L17
L2:
  movsd  -0x40(%rbp),%xmm0
  mov    -0x58(%rbp),%rax
  movapd %xmm0,%xmm1
  movq   %rax,%xmm0
  call   <unif@plt>
  movq   %xmm0,%rax
  mov    %rax,-0x20(%rbp)
  movsd  -0x38(%rbp),%xmm0
  mov    -0x50(%rbp),%rax
  movapd %xmm0,%xmm1
  movq   %rax,%xmm0
  call   <unif@plt>
  movq   %xmm0,%rax
  mov    %rax,-0x18(%rbp)
  movsd  -0x30(%rbp),%xmm0
  mov    -0x48(%rbp),%rax
  movapd %xmm0,%xmm1
  movq   %rax,%xmm0
  call   <unif@plt>
  movq   %xmm0,%rax
  mov    %rax,-0x10(%rbp)
  movsd  -0x10(%rbp),%xmm1
  movsd  -0x18(%rbp),%xmm0
  mov    -0x20(%rbp),%rax
  movapd %xmm1,%xmm2
  movapd %xmm0,%xmm1
  movq   %rax,%xmm0
  call   <f@plt>
  pxor   %xmm0,%xmm0
  cvtsi2sd %rax,%xmm0
  movsd  -0x28(%rbp),%xmm1
  addsd  %xmm1,%xmm0
  movsd  %xmm0,-0x28(%rbp)
  addl   $0x1,-0x5c(%rbp)
L17:
  mov    -0x60(%rbp),%eax
  cmp    %eax,-0x5c(%rbp)
  jl     L2
  movsd  -0x40(%rbp),%xmm0
  movsd  -0x58(%rbp),%xmm2
  movapd %xmm0,%xmm1
  subsd  %xmm2,%xmm1
  movsd  -0x38(%rbp),%xmm0
  movsd  -0x50(%rbp),%xmm2
  subsd  %xmm2,%xmm0
  mulsd  %xmm0,%xmm1
  movsd  -0x30(%rbp),%xmm0
  movsd  -0x48(%rbp),%xmm2
  subsd  %xmm2,%xmm0
  mulsd  %xmm0,%xmm1
  mov    -0x60(%rbp),%eax
  pxor   %xmm2,%xmm2
  cvtsi2sd %eax,%xmm2
  movsd  D103(%rip),%xmm0
  divsd  %xmm2,%xmm0
  mulsd  %xmm1,%xmm0
  mulsd  -0x28(%rbp),%xmm0
  movq   %xmm0,%rax
  movq   %rax,%xmm0
  lea    D126(%rip),%rax
  mov    %rax,%rdi
  mov    $0x1,%eax
  call   <printf@plt>
  mov    $0x0,%eax
  mov    -0x8(%rbp),%rdx
  sub    %fs:0x28,%rdx
  je     L8
  call   <__stack_chk_fail@plt>
L8:
  leave
  ret
```

tool_calls: name: parse_data
arguments: data_tag: D145
data_type: string
name: parse_data
arguments: data_tag: D68
data_type: string
name: parse_data
arguments: data_tag: D44
data_type: string
name: parse_data
arguments: data_tag: D12
data_type: string
name: parse_data
arguments: data_tag: D28
data_type: string
name: parse_data
arguments: data_tag: D169
data_type: string
name: parse_data
arguments: data_tag: D35
data_type: string
name: parse_data
arguments: data_tag: D144
data_type: string
name: parse_data
arguments: data_tag: D20
data_type: string
name: parse_data
arguments: data_tag: D83
data_type: string
name: parse_data
arguments: data_tag: D103
data_type: byte[8]
name: parse_data
arguments: data_tag: D126
data_type: string

tool: D145: 
Calculamos el integral de x+y+z con MC 


tool: D68: Entrar la primer limita del integral para x: a_x=

tool: D44: %lf

tool: D12: Entrar la segunda limita del integral para x: b_x= 

tool: D28: Entrar la primer limita del integral para y: a_y=

tool: D169: Entrar la segunda limita del integral para y: b_y= 

tool: D35: Entrar la primer limita del integral para z: a_z=

tool: D144: Entrar la segunda limita del integral para z: b_z= 

tool: D20: Entar el numero de simulacion : N=

tool: D83: %d

tool: {"D103": [0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0x3f]}

tool: D126: Integral de x+y+z:%1.4f


assistant: ```c
int main(int argc, char *argv[]) {
  int i = 0;
  int N;
  double sim_x;
  double sim_y;
  double sim_z;
  double sim;
  double a_x, a_y, a_z;
  double b_x, b_y, b_z;
  printf("\nCalculamos el integral de x+y+z con MC \n\n");
  printf("Entrar la primer limita del integral para x: a_x=");
  scanf("%lf", &a_x);
  printf("Entrar la segunda limita del integral para x: b_x= ");
  scanf("%lf", &b_x);
  printf("Entrar la primer limita del integral para y: a_y=");
  scanf("%lf", &a_y);
  printf("Entrar la segunda limita del integral para y: b_y= ");
  scanf("%lf", &b_y);
  printf("Entrar la primer limita del integral para z: a_z=");
  scanf("%lf", &a_z);
  printf("Entrar la segunda limita del integral para z: b_z= ");
  scanf("%lf", &b_z);
  printf("Entar el numero de simulacion : N=");
  scanf("%d", &N);
  srand(time(NULL));
  for (i = 0; i < N; i++) {
    sim_x = unif(a_x, b_x);
    sim_y = unif(a_y, b_y);
    sim_z = unif(a_z, b_z);
    sim += f(sim_x, sim_y, sim_z);
    ;
  }
  printf("Integral de x+y+z:%1.4f\n", (b_x - a_x) * (b_y - a_y) * (b_z - a_z) * (1 / (double)N) * sim);
}
```