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

```asm
<main>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x430,%rsp
  mov    %fs:0x28,%rax
  mov    %rax,-0x8(%rbp)
  xor    %eax,%eax
  lea    -0x42c(%rbp),%rdx
  lea    -0x430(%rbp),%rax
  mov    %rax,%rsi
  lea    D38(%rip),%rax
  mov    %rax,%rdi
  call   <scanf@plt>
  mov    -0x42c(%rbp),%ecx
  mov    -0x430(%rbp),%edx
  lea    -0x410(%rbp),%rax
  mov    %ecx,%r8d
  mov    %edx,%ecx
  lea    D54(%rip),%rdx
  mov    $0x400,%esi
  mov    %rax,%rdi
  call   <snprintf@plt>
  lea    -0x410(%rbp),%rax
  mov    %rax,%rdi
  call   <strlen@plt>
  mov    %eax,-0x428(%rbp)
  lea    -0x420(%rbp),%rax
  mov    %rax,%rdi
  call   <pipe@plt>
  lea    -0x418(%rbp),%rax
  mov    %rax,%rdi
  call   <pipe@plt>
  call   <fork@plt>
  mov    %eax,-0x424(%rbp)
  cmpl   $0x0,-0x424(%rbp)
  jne    L4
  mov    -0x420(%rbp),%eax
  mov    $0x0,%esi
  mov    %eax,%edi
  call   <dup2@plt>
  mov    -0x420(%rbp),%eax
  mov    %eax,%edi
  call   <close@plt>
  mov    -0x41c(%rbp),%eax
  mov    %eax,%edi
  call   <close@plt>
  mov    -0x414(%rbp),%eax
  mov    $0x1,%esi
  mov    %eax,%edi
  call   <dup2@plt>
  mov    -0x418(%rbp),%eax
  mov    %eax,%edi
  call   <close@plt>
  mov    -0x414(%rbp),%eax
  mov    %eax,%edi
  call   <close@plt>
  mov    $0x0,%ecx
  lea    D53(%rip),%rax
  mov    %rax,%rdx
  lea    D36(%rip),%rax
  mov    %rax,%rsi
  lea    D36(%rip),%rax
  mov    %rax,%rdi
  call   <execlp@plt>
  lea    D43(%rip),%rax
  mov    %rax,%rdi
  call   <die@plt>
  jmp    L6
L4:
  cmpl   $0x0,-0x424(%rbp)
  jns    L6
  lea    D26(%rip),%rax
  mov    %rax,%rdi
  call   <die@plt>
L6:
  mov    -0x41c(%rbp),%eax
  mov    -0x428(%rbp),%edx
  lea    -0x410(%rbp),%rcx
  mov    %rcx,%rsi
  mov    %eax,%edi
  call   <write@plt>
  mov    -0x420(%rbp),%eax
  mov    %eax,%edi
  call   <close@plt>
  mov    -0x41c(%rbp),%eax
  mov    %eax,%edi
  call   <close@plt>
  mov    -0x414(%rbp),%eax
  mov    %eax,%edi
  call   <close@plt>
  mov    -0x418(%rbp),%eax
  lea    -0x410(%rbp),%rcx
  mov    $0x400,%edx
  mov    %rcx,%rsi
  mov    %eax,%edi
  call   <read@plt>
  mov    %eax,-0x428(%rbp)
  mov    -0x428(%rbp),%eax
  cltq
  movb   $0x0,-0x410(%rbp,%rax,1)
  lea    -0x410(%rbp),%rax
  mov    %rax,%rsi
  lea    D73(%rip),%rax
  mov    %rax,%rdi
  call   <printf@plt>
  mov    $0x0,%eax
  mov    -0x8(%rbp),%rdx
  sub    %fs:0x28,%rdx
  je     L39
  call   <__stack_chk_fail@plt>
L39:
  leave
  ret
```

tool_calls: name: disassemble_data
arguments: tag: D38
data_type: string
name: disassemble_data
arguments: tag: D54
data_type: string
name: disassemble_data
arguments: tag: D53
data_type: string
name: disassemble_data
arguments: tag: D36
data_type: string
name: disassemble_data
arguments: tag: D43
data_type: string
name: disassemble_data
arguments: tag: D26
data_type: string
name: disassemble_data
arguments: tag: D73
data_type: string

tool: D38: %d%d

tool: D54: %d + %d


tool: D53: --quiet

tool: D36: /usr/bin/bc

tool: D43: execlp failed

tool: D26: fork failed

tool: D73: %s

assistant: ```c
int main(void) {
  int a, b, blen, pid;
  char buf[1024];
  int fd1[2], fd2[2];
  scanf("%d%d", &a, &b);
  snprintf(buf, sizeof(buf), "%d + %d\n", a, b);
  blen = strlen(buf);
  if (pipe(fd1) < 0) {
  }
  if (pipe(fd2) < 0) {
  }
  if (!(pid = fork())) {
    dup2(fd1[0], 0);
    close(fd1[0]);
    close(fd1[1]);
    dup2(fd2[1], 1);
    close(fd2[0]);
    close(fd2[1]);
    execlp("/usr/bin/bc", "/usr/bin/bc", "--quiet", NULL);
    die("execlp failed");
  } else if (pid < 0) {
    die("fork failed");
  }
  write(fd1[1], buf, blen);
  close(fd1[0]);
  close(fd1[1]);
  close(fd2[1]);
  blen = read(fd2[0], buf, sizeof(buf));
  buf[blen] = 0;
  printf("%s", buf);
  return 0;
}
```