user: 下面的汇编指令对应的C源代码是什么:

```asm
<UARTRecv>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x40,%rsp
  mov    %edi,%eax
  mov    %rsi,-0x20(%rbp)
  mov    %rdx,-0x28(%rbp)
  mov    %ecx,-0x18(%rbp)
  mov    %r8d,%ecx
  mov    %r9d,-0x30(%rbp)
  mov    0x18(%rbp),%edx
  mov    %al,-0x14(%rbp)
  mov    %ecx,%eax
  mov    %al,-0x2c(%rbp)
  mov    %edx,%eax
  mov    %al,-0x34(%rbp)
  movl   $0x0,-0x8(%rbp)
  cmpb   $0x0,-0x2c(%rbp)
  je     L136
  mov    -0x30(%rbp),%eax
  jmp    L233
L136:
  mov    $0x0,%eax
L233:
  mov    D248(%rip),%edx
  mov    %edx,%ecx
  mov    -0x18(%rbp),%edx
  sub    %ecx,%edx
  add    $0x4,%edx
  mov    D248(%rip),%ecx
  movslq %ecx,%rcx
  lea    D120(%rip),%rsi
  add    %rcx,%rsi
  movzbl -0x14(%rbp),%edi
  mov    %eax,%ecx
  call   <mdaq_uart_read@plt>
  mov    %eax,-0x4(%rbp)
  cmpb   $0x0,-0x34(%rbp)
  je     L157
  cmpl   $0x0,-0x4(%rbp)
  jle    L25
  mov    D248(%rip),%eax
  test   %eax,%eax
  je     L132
  mov    D57(%rip),%eax
  test   %eax,%eax
  jne    L132
  mov    D248(%rip),%edx
  mov    -0x4(%rbp),%eax
  add    %edx,%eax
  cmp    %eax,-0x18(%rbp)
  ja     L219
  mov    -0x18(%rbp),%edx
  mov    -0x20(%rbp),%rax
  lea    D120(%rip),%rcx
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <memcpy@plt>
  mov    -0x18(%rbp),%edx
  mov    -0x28(%rbp),%rax
  mov    %edx,(%rax)
  movl   $0x0,D248(%rip)
  jmp    L234
L219:
  mov    D248(%rip),%edx
  mov    -0x4(%rbp),%eax
  add    %edx,%eax
  mov    %eax,D226(%rip)
  jmp    L234
L132:
  movl   $0x0,-0x8(%rbp)
  jmp    L61
L207:
  mov    D226(%rip),%edx
  mov    -0x8(%rbp),%eax
  add    %edx,%eax
  cltq
  lea    D120(%rip),%rdx
  movzbl (%rax,%rdx,1),%edx
  mov    D57(%rip),%eax
  cltq
  lea    0x10(%rax),%rax
  add    %rbp,%rax
  movzbl (%rax),%eax
  cmp    %al,%dl
  jne    L174
  mov    D57(%rip),%eax
  add    $0x1,%eax
  mov    %eax,D226(%rip)
  jmp    L50
L174:
  movl   $0x0,D226(%rip)
L50:
  mov    D226(%rip),%eax
  cmp    $0x4,%eax
  jne    L164
  addl   $0x1,-0x8(%rbp)
  mov    D226(%rip),%edx
  mov    -0x4(%rbp),%eax
  add    %edx,%eax
  sub    -0x8(%rbp),%eax
  cmp    %eax,-0x18(%rbp)
  jne    L183
  mov    -0x4(%rbp),%eax
  sub    -0x8(%rbp),%eax
  mov    $0x200,%edx
  cmp    %edx,%eax
  cmovle %eax,%edx
  mov    D226(%rip),%eax
  movslq %eax,%rcx
  mov    -0x8(%rbp),%eax
  cltq
  add    %rax,%rcx
  lea    D120(%rip),%rax
  add    %rax,%rcx
  mov    -0x20(%rbp),%rax
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <memcpy@plt>
  mov    -0x18(%rbp),%edx
  mov    -0x28(%rbp),%rax
  mov    %edx,(%rax)
  movl   $0x0,D226(%rip)
  jmp    L12
L183:
  mov    -0x4(%rbp),%eax
  sub    -0x8(%rbp),%eax
  mov    $0x200,%edx
  cmp    %edx,%eax
  cmovg  %edx,%eax
  mov    D226(%rip),%edx
  movslq %edx,%rcx
  mov    -0x8(%rbp),%edx
  movslq %edx,%rdx
  add    %rdx,%rcx
  lea    D120(%rip),%rdx
  add    %rdx,%rcx
  mov    %eax,%edx
  mov    %rcx,%rsi
  lea    D120(%rip),%rax
  mov    %rax,%rdi
  call   <memmove@plt>
  mov    -0x4(%rbp),%eax
  sub    -0x8(%rbp),%eax
  mov    %eax,D226(%rip)
  mov    -0x28(%rbp),%rax
  movl   $0xffffffff,(%rax)
L12:
  movl   $0x0,D226(%rip)
  jmp    L203
L164:
  addl   $0x1,-0x8(%rbp)
L61:
  mov    -0x8(%rbp),%eax
  cmp    -0x4(%rbp),%eax
  jl     L207
L203:
  mov    -0x8(%rbp),%eax
  cmp    -0x4(%rbp),%eax
  jne    L234
  mov    D226(%rip),%eax
  cmp    $0x3,%eax
  ja     L234
  mov    -0x28(%rbp),%rax
  movl   $0xffffffff,(%rax)
  jmp    L234
L25:
  mov    -0x28(%rbp),%rax
  mov    -0x4(%rbp),%edx
  mov    %edx,(%rax)
  jmp    L234
L157:
  cmpb   $0x0,-0x2c(%rbp)
  je     L3
  mov    -0x28(%rbp),%rax
  mov    -0x4(%rbp),%edx
  mov    %edx,(%rax)
  jmp    L234
L3:
  mov    -0x4(%rbp),%eax
  mov    $0x0,%edx
  test   %eax,%eax
  cmovns %eax,%edx
  mov    -0x28(%rbp),%rax
  mov    %edx,(%rax)
  jmp    L234
L234:
  nop
  leave
  ret
```

assistant: ```c
void UARTRecv(unsigned char module, unsigned char *data, int *status, unsigned int size, unsigned char blocking, unsigned int timeout, unsigned int msg_header, unsigned char use_msg_header) {
  int data_idx = 0;
  static unsigned char rx_buffer[(512) + 4];
  static int rx_buf_idx = 0;
  static int msg_header_at = 0;
  int result = mdaq_uart_read(module, rx_buffer + rx_buf_idx, size + (sizeof(msg_header) - rx_buf_idx), blocking ? timeout : 0);
  if (use_msg_header) {
    if (result > 0) {
      if (rx_buf_idx && !msg_header_at) {
        if (rx_buf_idx + result >= size) {
          memcpy(data, rx_buffer, size);
          *status = size;
          rx_buf_idx = 0;
        } else {
          rx_buf_idx += result;
        }
      } else {
        for (data_idx = 0; data_idx < result; data_idx++) {
          if (rx_buffer[data_idx + rx_buf_idx] == *(((unsigned char *)(&msg_header)) + msg_header_at))
            msg_header_at++;
          else
            msg_header_at = 0;
          if (msg_header_at == sizeof(msg_header)) {
            data_idx++;
            if (size == rx_buf_idx + result - data_idx) {
              memcpy(data, rx_buffer + rx_buf_idx + data_idx, (result - data_idx) > (512) ? (512) : result - data_idx);
              *status = size;
              rx_buf_idx = 0;
            } else {
              memmove(rx_buffer, rx_buffer + rx_buf_idx + data_idx, (result - data_idx) > (512) ? (512) : result - data_idx);
              rx_buf_idx = result - data_idx;
              *status = (-1);
            }
            msg_header_at = 0;
            break;
          }
        }
        if (data_idx == result && msg_header_at < sizeof(msg_header))
          *status = -1;
      }
    } else {
      *status = result;
    }
  } else {
    if (blocking)
      *status = result;
    else
      *status = result > 0 ? result : 0;
  }
}
```