user: 这段汇编代码用C语言表示是什么样的?

```asm
<check_date>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  mov    %rdi,-0x18(%rbp)
  movl   $0x1f,-0x10(%rbp)
  mov    -0x18(%rbp),%rax
  add    $0x4,%rax
  movzbl (%rax),%eax
  movsbl %al,%eax
  lea    -0x30(%rax),%edx
  mov    %edx,%eax
  shl    $0x2,%eax
  add    %edx,%eax
  add    %eax,%eax
  mov    %eax,%edx
  mov    -0x18(%rbp),%rax
  add    $0x5,%rax
  movzbl (%rax),%eax
  movsbl %al,%eax
  sub    $0x30,%eax
  add    %edx,%eax
  mov    %eax,-0xc(%rbp)
  mov    -0x18(%rbp),%rax
  add    $0x2,%rax
  movzbl (%rax),%eax
  movsbl %al,%eax
  lea    -0x30(%rax),%edx
  mov    %edx,%eax
  shl    $0x2,%eax
  add    %edx,%eax
  add    %eax,%eax
  mov    %eax,%edx
  mov    -0x18(%rbp),%rax
  add    $0x3,%rax
  movzbl (%rax),%eax
  movsbl %al,%eax
  sub    $0x30,%eax
  add    %edx,%eax
  mov    %eax,-0x8(%rbp)
  mov    -0x18(%rbp),%rax
  movzbl (%rax),%eax
  movsbl %al,%eax
  lea    -0x30(%rax),%edx
  mov    %edx,%eax
  shl    $0x2,%eax
  add    %edx,%eax
  add    %eax,%eax
  mov    %eax,%edx
  mov    -0x18(%rbp),%rax
  add    $0x1,%rax
  movzbl (%rax),%eax
  movsbl %al,%eax
  sub    $0x30,%eax
  add    %edx,%eax
  mov    %eax,-0x4(%rbp)
  cmpl   $0x0,-0x8(%rbp)
  jle    L457
  cmpl   $0xc,-0x8(%rbp)
  jle    L252
L457:
  cmpl   $0x14,-0x8(%rbp)
  jle    L414
  cmpl   $0x20,-0x8(%rbp)
  jle    L252
L414:
  cmpl   $0x28,-0x8(%rbp)
  jle    L370
  cmpl   $0x34,-0x8(%rbp)
  jle    L252
L370:
  mov    $0x0,%eax
  jmp    L47
L252:
  cmpl   $0x34,-0x8(%rbp)
  ja     L205
  mov    -0x8(%rbp),%eax
  lea    0x0(,%rax,4),%rdx
  lea    D11(%rip),%rax
  mov    (%rdx,%rax,1),%eax
  cltq
  lea    D11(%rip),%rdx
  add    %rdx,%rax
  notrack jmp *%rax
  movl   $0x1f,-0x10(%rbp)
  jmp    L205
  mov    -0x4(%rbp),%eax
  and    $0x3,%eax
  test   %eax,%eax
  jne    L25
  movl   $0x1d,-0x10(%rbp)
  jmp    L205
L25:
  movl   $0x1c,-0x10(%rbp)
  jmp    L205
  movl   $0x1f,-0x10(%rbp)
  jmp    L205
  movl   $0x1e,-0x10(%rbp)
  jmp    L205
  movl   $0x1f,-0x10(%rbp)
  jmp    L205
  movl   $0x1e,-0x10(%rbp)
  jmp    L205
  movl   $0x1f,-0x10(%rbp)
  jmp    L205
  movl   $0x1f,-0x10(%rbp)
  jmp    L205
  movl   $0x1e,-0x10(%rbp)
  jmp    L205
  movl   $0x1f,-0x10(%rbp)
  jmp    L205
  movl   $0x1e,-0x10(%rbp)
  jmp    L205
  movl   $0x1f,-0x10(%rbp)
  jmp    L205
  movl   $0x1f,-0x10(%rbp)
  jmp    L205
  mov    -0x4(%rbp),%eax
  and    $0x3,%eax
  test   %eax,%eax
  jne    L133
  movl   $0x1d,-0x10(%rbp)
  jmp    L205
L133:
  movl   $0x1c,-0x10(%rbp)
  jmp    L205
  movl   $0x1f,-0x10(%rbp)
  jmp    L205
  movl   $0x1e,-0x10(%rbp)
  jmp    L205
  movl   $0x1f,-0x10(%rbp)
  jmp    L205
  movl   $0x1e,-0x10(%rbp)
  jmp    L205
  movl   $0x1f,-0x10(%rbp)
  jmp    L205
  movl   $0x1f,-0x10(%rbp)
  jmp    L205
  movl   $0x1e,-0x10(%rbp)
  jmp    L205
  movl   $0x1f,-0x10(%rbp)
  jmp    L205
  movl   $0x1e,-0x10(%rbp)
  jmp    L205
  movl   $0x1f,-0x10(%rbp)
  jmp    L205
  movl   $0x1f,-0x10(%rbp)
  jmp    L205
  mov    -0x4(%rbp),%eax
  and    $0x3,%eax
  test   %eax,%eax
  jne    L110
  movl   $0x1d,-0x10(%rbp)
  jmp    L205
L110:
  movl   $0x1c,-0x10(%rbp)
  jmp    L205
  movl   $0x1f,-0x10(%rbp)
  jmp    L205
  movl   $0x1e,-0x10(%rbp)
  jmp    L205
  movl   $0x1f,-0x10(%rbp)
  jmp    L205
  movl   $0x1e,-0x10(%rbp)
  jmp    L205
  movl   $0x1f,-0x10(%rbp)
  jmp    L205
  movl   $0x1f,-0x10(%rbp)
  jmp    L205
  movl   $0x1e,-0x10(%rbp)
  jmp    L205
  movl   $0x1f,-0x10(%rbp)
  jmp    L205
  movl   $0x1e,-0x10(%rbp)
  jmp    L205
  movl   $0x1f,-0x10(%rbp)
  nop
L205:
  cmpl   $0x0,-0xc(%rbp)
  jle    L154
  mov    -0xc(%rbp),%eax
  cmp    -0x10(%rbp),%eax
  jg     L154
  mov    $0x1,%eax
  jmp    L47
L154:
  mov    $0x0,%eax
L47:
  pop    %rbp
  ret
```

assistant: ```c
int check_date(char serial_number[12]) {
  int date;
  int month;
  int year;
  int max_date = 31;
  date = (serial_number[4] - '0') * 10 + (serial_number[5] - '0');
  month = (serial_number[2] - '0') * 10 + (serial_number[3] - '0');
  year = (serial_number[0] - '0') * 10 + (serial_number[1] - '0');
  if (!((month >= 1 && month <= 12) || (month >= 21 && month <= 32) || (month >= 41 && month <= 52))) {
    return 0;
  }
  switch (month) {
  case 1:
    max_date = 31;
    break;
  case 2:
    if (year % 4 == 0) {
      max_date = 29;
    } else {
      max_date = 28;
    }
    break;
  case 3:
    max_date = 31;
    break;
  case 4:
    max_date = 30;
    break;
  case 5:
    max_date = 31;
    break;
  case 6:
    max_date = 30;
    break;
  case 7:
    max_date = 31;
    break;
  case 8:
    max_date = 31;
    break;
  case 9:
    max_date = 30;
    break;
  case 10:
    max_date = 31;
    break;
  case 11:
    max_date = 30;
    break;
  case 12:
    max_date = 31;
    break;
  case 21:
    max_date = 31;
    break;
  case 22:
    if (year % 4 == 0) {
      max_date = 29;
    } else {
      max_date = 28;
    }
    break;
  case 23:
    max_date = 31;
    break;
  case 24:
    max_date = 30;
    break;
  case 25:
    max_date = 31;
    break;
  case 26:
    max_date = 30;
    break;
  case 27:
    max_date = 31;
    break;
  case 28:
    max_date = 31;
    break;
  case 29:
    max_date = 30;
    break;
  case 30:
    max_date = 31;
    break;
  case 31:
    max_date = 30;
    break;
  case 32:
    max_date = 31;
    break;
  case 41:
    max_date = 31;
    break;
  case 42:
    if (year % 4 == 0) {
      max_date = 29;
    } else {
      max_date = 28;
    }
    break;
  case 43:
    max_date = 31;
    break;
  case 44:
    max_date = 30;
    break;
  case 45:
    max_date = 31;
    break;
  case 46:
    max_date = 30;
    break;
  case 47:
    max_date = 31;
    break;
  case 48:
    max_date = 31;
    break;
  case 49:
    max_date = 30;
    break;
  case 50:
    max_date = 31;
    break;
  case 51:
    max_date = 30;
    break;
  case 52:
    max_date = 31;
    break;
  }
  if ((1 <= date) && (date <= max_date)) {
    return 1;
  }
  return 0;
}
```