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

```asm
<valid_email>:
  endbr64
  push   %r12
  push   %rbp
  push   %rbx
  mov    %rdi,%rbx
  call   <strlen@plt>
  test   %eax,%eax
  jle    L133
  xor    %r12d,%r12d
L138:
  movzbl (%rbx,%r12,1),%eax
  lea    0x1(%r12),%ebp
  mov    %rbx,%rdi
  sub    $0x61,%eax
  cmp    $0x19,%al
  ja     L359
  call   <strlen@plt>
  cmp    %ebp,%eax
  jle    L133
  movslq %ebp,%rbp
L251:
  cmpb   $0x20,(%rbx,%rbp,1)
  lea    0x1(%rbp),%r12d
  mov    %rbx,%rdi
  je     L261
  call   <strlen@plt>
  add    $0x1,%rbp
  cmp    %ebp,%eax
  jg     L251
L133:
  pop    %rbx
  xor    %eax,%eax
  pop    %rbp
  pop    %r12
  ret
  nopl   0x0(%rax,%rax,1)
L359:
  call   <strlen@plt>
  add    $0x1,%r12
  cmp    %r12d,%eax
  jg     L138
  jmp    L133
L261:
  call   <strlen@plt>
  cmp    %eax,%r12d
  jge    L133
  movslq %r12d,%rbp
  mov    %rbx,%rdi
  cmpb   $0x3c,(%rbx,%rbp,1)
  lea    0x1(%rbp),%r12d
  je     L266
L153:
  call   <strlen@plt>
  add    $0x1,%rbp
  cmp    %ebp,%eax
  jle    L133
  cmpb   $0x3c,(%rbx,%rbp,1)
  lea    0x1(%rbp),%r12d
  mov    %rbx,%rdi
  jne    L153
L266:
  call   <strlen@plt>
  cmp    %eax,%r12d
  jge    L133
  movslq %r12d,%r12
L68:
  movzbl (%rbx,%r12,1),%eax
  lea    0x1(%r12),%ebp
  mov    %rbx,%rdi
  sub    $0x61,%eax
  cmp    $0x19,%al
  jbe    L289
  call   <strlen@plt>
  add    $0x1,%r12
  cmp    %r12d,%eax
  jg     L68
  jmp    L133
  nopl   0x0(%rax,%rax,1)
L289:
  call   <strlen@plt>
  cmp    %eax,%ebp
  jge    L133
  movslq %ebp,%rbp
  mov    %rbx,%rdi
  cmpb   $0x40,(%rbx,%rbp,1)
  lea    0x1(%rbp),%r12d
  je     L16
L258:
  call   <strlen@plt>
  add    $0x1,%rbp
  cmp    %ebp,%eax
  jle    L133
  cmpb   $0x40,(%rbx,%rbp,1)
  lea    0x1(%rbp),%r12d
  mov    %rbx,%rdi
  jne    L258
L16:
  call   <strlen@plt>
  cmp    %eax,%r12d
  jge    L133
  movslq %r12d,%r12
L167:
  movzbl (%rbx,%r12,1),%eax
  lea    0x1(%r12),%ebp
  mov    %rbx,%rdi
  sub    $0x61,%eax
  cmp    $0x19,%al
  jbe    L202
  call   <strlen@plt>
  add    $0x1,%r12
  cmp    %r12d,%eax
  jg     L167
  jmp    L133
  nopl   0x0(%rax,%rax,1)
L202:
  call   <strlen@plt>
  cmp    %eax,%ebp
  jge    L133
  movslq %ebp,%rbp
  mov    %rbx,%rdi
  cmpb   $0x2e,(%rbx,%rbp,1)
  lea    0x1(%rbp),%r12d
  je     L183
L232:
  call   <strlen@plt>
  add    $0x1,%rbp
  cmp    %ebp,%eax
  jle    L133
  cmpb   $0x2e,(%rbx,%rbp,1)
  lea    0x1(%rbp),%r12d
  mov    %rbx,%rdi
  jne    L232
L183:
  call   <strlen@plt>
  cmp    %eax,%r12d
  jge    L133
  movslq %r12d,%r12
L363:
  movzbl (%rbx,%r12,1),%eax
  lea    0x1(%r12),%ebp
  mov    %rbx,%rdi
  sub    $0x61,%eax
  cmp    $0x19,%al
  jbe    L281
  call   <strlen@plt>
  add    $0x1,%r12
  cmp    %r12d,%eax
  jg     L363
  jmp    L133
  nopl   0x0(%rax,%rax,1)
L281:
  call   <strlen@plt>
  cmp    %ebp,%eax
  jle    L133
  movslq %ebp,%rbp
  mov    %rbx,%rdi
  cmpb   $0x3e,(%rbx,%rbp,1)
  lea    0x1(%rbp),%r12d
  je     L85
L283:
  call   <strlen@plt>
  add    $0x1,%rbp
  cmp    %ebp,%eax
  jle    L133
  cmpb   $0x3e,(%rbx,%rbp,1)
  lea    0x1(%rbp),%r12d
  mov    %rbx,%rdi
  jne    L283
L85:
  call   <strlen@plt>
  cmp    %r12d,%eax
  jle    L181
L10:
  mov    %rbx,%rdi
  add    $0x1,%r12d
  call   <strlen@plt>
  cmp    %eax,%r12d
  jl     L10
L181:
  pop    %rbx
  mov    $0x1,%eax
  pop    %rbp
  pop    %r12
  ret
```

assistant: ```c
int valid_email(char *email_address) {
  int i, state = 0;
  for (i = 0; i < strlen(email_address); i++) {
    switch (state) {
    case 0: {
      if ((email_address[i] >= 'a') && (email_address[i] <= 'z')) {
        state++;
      }
      break;
    }
    case 1: {
      if (email_address[i] == ' ') {
        state++;
      }
      break;
    }
    case 2: {
      if (email_address[i] == '<') {
        state++;
      }
      break;
    }
    case 3: {
      if ((email_address[i] >= 'a') && (email_address[i] <= 'z')) {
        state++;
      }
      break;
    }
    case 4: {
      if (email_address[i] == '@') {
        state++;
      }
      break;
    }
    case 5: {
      if ((email_address[i] >= 'a') && (email_address[i] <= 'z')) {
        state++;
      }
      break;
    }
    case 6: {
      if (email_address[i] == '.') {
        state++;
      }
      break;
    }
    case 7: {
      if ((email_address[i] >= 'a') && (email_address[i] <= 'z')) {
        state++;
      }
      break;
    }
    case 8: {
      if (email_address[i] == '>') {
        state++;
      }
      break;
    }
    }
  }
  if (state == 9)
    return 1;
  return 0;
}
```