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

```asm
<lpc_send_command>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0xb0,%rsp
  mov    %rdi,-0xa8(%rbp)
  mov    %rsi,-0xb0(%rbp)
  mov    %fs:0x28,%rax
  mov    %rax,-0x8(%rbp)
  xor    %eax,%eax
  mov    -0xb0(%rbp),%rax
  mov    %rax,%rsi
  lea    D63(%rip),%rax
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  mov    -0xb0(%rbp),%rdx
  lea    -0x90(%rbp),%rax
  lea    D47(%rip),%rcx
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <sprintf@plt>
  lea    -0x90(%rbp),%rax
  mov    %rax,%rdi
  call   <strlen@plt>
  mov    %eax,%edx
  lea    -0x90(%rbp),%rsi
  mov    -0xa8(%rbp),%rax
  mov    $0x1,%ecx
  mov    %rax,%rdi
  call   <serial_send@plt>
  test   %rax,%rax
  jns    L35
  lea    D15(%rip),%rax
  mov    %rax,%rdi
  call   <puts@plt>
  mov    $0xffffffff,%eax
  jmp    L11
L35:
  lea    -0x90(%rbp),%rcx
  mov    -0xa8(%rbp),%rax
  mov    $0x80,%edx
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <serial_readln@plt>
  mov    %eax,-0x98(%rbp)
  cmpl   $0x80,-0x98(%rbp)
  jne    L56
  lea    D31(%rip),%rax
  mov    %rax,%rdi
  call   <puts@plt>
  mov    $0xffffffff,%eax
  jmp    L11
L56:
  mov    -0x98(%rbp),%eax
  sub    $0x2,%eax
  cltq
  movb   $0x0,-0x90(%rbp,%rax,1)
  lea    -0x90(%rbp),%rax
  mov    %rax,%rdi
  call   <atoi@plt>
  mov    %eax,-0x94(%rbp)
  mov    -0x94(%rbp),%eax
  mov    %eax,%edi
  call   <lpc_show_error@plt>
  mov    %rax,%rsi
  mov    -0x94(%rbp),%edx
  lea    -0x90(%rbp),%rax
  mov    %edx,%ecx
  mov    %rsi,%rdx
  mov    %rax,%rsi
  lea    D21(%rip),%rax
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  lea    -0x90(%rbp),%rax
  lea    D32(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strcmp@plt>
  test   %rax,%rax
  je     L21
  mov    -0x94(%rbp),%eax
  mov    %eax,%edi
  call   <lpc_show_error@plt>
  mov    %rax,%rcx
  mov    -0x94(%rbp),%esi
  lea    -0x90(%rbp),%rdx
  mov    -0xb0(%rbp),%rax
  mov    %esi,%r8d
  mov    %rax,%rsi
  lea    D36(%rip),%rax
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  mov    $0xffffffff,%eax
  jmp    L11
L21:
  mov    $0x0,%eax
L11:
  mov    -0x8(%rbp),%rdx
  sub    %fs:0x28,%rdx
  je     L51
  call   <__stack_chk_fail@plt>
L51:
  leave
  ret
```

tool_calls: name: read_data
arguments: label: D63
datatype: string
name: read_data
arguments: label: D47
datatype: string
name: read_data
arguments: label: D15
datatype: string
name: read_data
arguments: label: D31
datatype: string
name: read_data
arguments: label: D21
datatype: string
name: read_data
arguments: label: D32
datatype: string
name: read_data
arguments: label: D36
datatype: string

tool: D63: lpc_send_command command='%s'


tool: D47: %s


tool: D15: Error: serial port problem

tool: D31: Error: read error (128)

tool: D21: buffer='%s'  %s (%d)


tool: D32: 0

tool: D36: Error: lpc_send_command(%s) error status='%s' %s (%d).


assistant: ```c
int lpc_send_command(struct _serial *serial, char *command) {
  char buffer[128];
  int err_code;
  int len;
  printf("lpc_send_command command='%s'\n", command);
  sprintf(buffer, "%s\r\n", command);
  if (serial_send(serial, (uint8_t *)buffer, strlen(buffer), 1) < 0) {
    printf("Error: serial port problem\n");
    return -1;
  }
  len = serial_readln(serial, buffer, 128);
  if (len == 128) {
    printf("Error: read error (128)\n");
    return -1;
  }
  buffer[len - 2] = 0;
  err_code = atoi(buffer);
  printf("buffer='%s'  %s (%d)\n", buffer, lpc_show_error(err_code), err_code);
  if (strcmp(buffer, "0") != 0) {
    printf("Error: lpc_send_command(%s) error status='%s' %s (%d).\n", command, buffer, lpc_show_error(err_code), err_code);
    return -1;
  }
  return 0;
}
```