user: What would the C source look like for the assembly code provided here?

```asm
<read2arg>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x50,%rsp
  mov    %rdi,-0x28(%rbp)
  mov    %rsi,-0x30(%rbp)
  mov    %rdx,-0x38(%rbp)
  mov    %ecx,-0x3c(%rbp)
  mov    %r8,-0x48(%rbp)
  mov    %fs:0x28,%rax
  mov    %rax,-0x8(%rbp)
  xor    %eax,%eax
  movabs $0x3030303030303030,%rax
  mov    %rax,-0x13(%rbp)
  movw   $0x0,-0xb(%rbp)
  movb   $0x0,-0x9(%rbp)
  mov    -0x28(%rbp),%rax
  mov    (%rax),%eax
  add    $0x1,%eax
  cmp    %eax,-0x3c(%rbp)
  jle    L149
  mov    -0x28(%rbp),%rax
  mov    (%rax),%eax
  lea    0x1(%rax),%edx
  mov    -0x28(%rbp),%rax
  mov    %edx,(%rax)
  mov    -0x28(%rbp),%rax
  mov    (%rax),%eax
  movslq %eax,%rdx
  mov    -0x48(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0x60,%al
  jle    L26
  mov    -0x28(%rbp),%rax
  mov    (%rax),%eax
  movslq %eax,%rdx
  mov    -0x48(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0x7a,%al
  jg     L26
  mov    -0x28(%rbp),%rax
  mov    (%rax),%eax
  movslq %eax,%rdx
  mov    -0x48(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  movsbl %al,%eax
  lea    -0x61(%rax),%edx
  mov    -0x38(%rbp),%rax
  mov    %edx,(%rax)
  mov    -0x28(%rbp),%rax
  mov    (%rax),%eax
  lea    0x1(%rax),%edx
  mov    -0x28(%rbp),%rax
  mov    %edx,(%rax)
  mov    -0x28(%rbp),%rax
  mov    (%rax),%eax
  add    $0x1,%eax
  cmp    %eax,-0x3c(%rbp)
  jg     L79
  jmp    L71
L26:
  mov    $0x1,%eax
  jmp    L107
L79:
  mov    -0x28(%rbp),%rax
  mov    (%rax),%eax
  movslq %eax,%rdx
  mov    -0x48(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0x60,%al
  jle    L25
  mov    -0x28(%rbp),%rax
  mov    (%rax),%eax
  movslq %eax,%rdx
  mov    -0x48(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0x7a,%al
  jg     L25
  mov    -0x28(%rbp),%rax
  mov    (%rax),%eax
  movslq %eax,%rdx
  mov    -0x48(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  movsbl %al,%eax
  lea    -0x61(%rax),%edx
  mov    -0x30(%rbp),%rax
  mov    %edx,(%rax)
  jmp    L71
L25:
  mov    -0x28(%rbp),%rax
  mov    (%rax),%eax
  movslq %eax,%rdx
  mov    -0x48(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0x2f,%al
  jle    L92
  mov    -0x28(%rbp),%rax
  mov    (%rax),%eax
  movslq %eax,%rdx
  mov    -0x48(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    $0x39,%al
  jg     L92
  mov    -0x28(%rbp),%rax
  mov    (%rax),%edx
  mov    -0x3c(%rbp),%eax
  sub    %edx,%eax
  mov    %eax,%esi
  mov    -0x28(%rbp),%rax
  mov    (%rax),%eax
  movslq %eax,%rdx
  mov    -0x48(%rbp),%rax
  lea    (%rdx,%rax,1),%rdi
  lea    -0x13(%rbp),%rax
  mov    $0x5e,%r8d
  mov    $0x8,%ecx
  mov    %rax,%rdx
  call   <readnum@plt>
  mov    %eax,-0x1c(%rbp)
  lea    -0x13(%rbp),%rax
  mov    %rax,%rdi
  call   <atoi@plt>
  mov    %eax,-0x18(%rbp)
  mov    -0x18(%rbp),%eax
  shl    $0x8,%eax
  or     $0xff,%al
  mov    %eax,%edx
  mov    -0x30(%rbp),%rax
  mov    %edx,(%rax)
  mov    -0x28(%rbp),%rax
  mov    (%rax),%edx
  mov    -0x1c(%rbp),%eax
  add    %eax,%edx
  mov    -0x28(%rbp),%rax
  mov    %edx,(%rax)
  jmp    L71
L92:
  mov    $0x1,%eax
  jmp    L107
L149:
  mov    $0x1,%eax
  jmp    L107
L71:
  mov    $0x0,%eax
L107:
  mov    -0x8(%rbp),%rdx
  sub    %fs:0x28,%rdx
  je     L52
  call   <__stack_chk_fail@plt>
L52:
  leave
  ret
```

assistant: ```c
int read2arg(int *pos, int *data, int *reg, int length, char *songstr) {
  int t;
  int t2;
  char tmpstr[11] = "00000000";
  if (*pos + 1 < length) {
    ++*pos;
    if (songstr[*pos] >= 'a' && songstr[*pos] <= 'z') {
      *reg = (songstr[*pos] - 'a');
      ++*pos;
    } else {
      return (1);
    }
    if (*pos + 1 < length) {
      if (songstr[*pos] >= 'a' && songstr[*pos] <= 'z') {
        *data = (songstr[*pos] - 'a');
      } else if (songstr[*pos] >= '0' && songstr[*pos] <= '9') {
        t2 = readnum(&(songstr[*pos]), length - *pos, tmpstr, 8, '^');
        t = atoi(tmpstr);
        *data = (t << 8 | 0xFF);
        *pos += t2;
      } else {
        return (1);
      }
    }
  } else {
    return (1);
  }
  return (0);
}
```