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

```asm
<main>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  push   %rbx
  sub    $0x18,%rsp
  movl   $0x30,-0x1c(%rbp)
  jmp    L255
L107:
  mov    -0x1c(%rbp),%eax
  mov    %eax,%edi
  call   <skiboot_isdigit@plt>
  mov    %eax,%edi
  call   <assert@plt>
  addl   $0x1,-0x1c(%rbp)
L255:
  cmpl   $0x39,-0x1c(%rbp)
  jle    L107
  mov    $0x61,%edi
  call   <skiboot_isdigit@plt>
  test   %eax,%eax
  sete   %al
  movzbl %al,%eax
  mov    %eax,%edi
  call   <assert@plt>
  mov    $0x5a,%edi
  call   <skiboot_isdigit@plt>
  test   %eax,%eax
  sete   %al
  movzbl %al,%eax
  mov    %eax,%edi
  call   <assert@plt>
  movl   $0x0,-0x1c(%rbp)
  jmp    L16
L152:
  mov    -0x1c(%rbp),%eax
  mov    %eax,%edi
  call   <skiboot_isdigit@plt>
  mov    %eax,-0x18(%rbp)
  mov    -0x1c(%rbp),%eax
  sub    $0x30,%eax
  cmp    $0x9,%eax
  setbe  %al
  movzbl %al,%eax
  mov    %eax,-0x14(%rbp)
  cmpl   $0x0,-0x18(%rbp)
  je     L166
  mov    -0x14(%rbp),%eax
  mov    %eax,%edi
  call   <assert@plt>
L166:
  cmpl   $0x0,-0x18(%rbp)
  jne    L62
  cmpl   $0x0,-0x14(%rbp)
  sete   %al
  movzbl %al,%eax
  mov    %eax,%edi
  call   <assert@plt>
L62:
  addl   $0x1,-0x1c(%rbp)
L16:
  cmpl   $0x100,-0x1c(%rbp)
  jle    L152
  movl   $0x30,-0x1c(%rbp)
  jmp    L176
L5:
  mov    -0x1c(%rbp),%eax
  mov    %eax,%edi
  call   <skiboot_isprint@plt>
  mov    %eax,%edi
  call   <assert@plt>
  addl   $0x1,-0x1c(%rbp)
L176:
  cmpl   $0x39,-0x1c(%rbp)
  jle    L5
  mov    $0x0,%edi
  call   <skiboot_isprint@plt>
  test   %eax,%eax
  sete   %al
  movzbl %al,%eax
  mov    %eax,%edi
  call   <assert@plt>
  mov    $0x4,%edi
  call   <skiboot_isprint@plt>
  test   %eax,%eax
  sete   %al
  movzbl %al,%eax
  mov    %eax,%edi
  call   <assert@plt>
  movl   $0x0,-0x1c(%rbp)
  jmp    L92
L253:
  mov    -0x1c(%rbp),%eax
  mov    %eax,%edi
  call   <skiboot_isprint@plt>
  mov    %eax,-0x18(%rbp)
  mov    -0x1c(%rbp),%eax
  mov    %eax,%edi
  call   <isprint@plt>
  mov    %eax,-0x14(%rbp)
  cmpl   $0x0,-0x18(%rbp)
  je     L257
  mov    -0x14(%rbp),%eax
  mov    %eax,%edi
  call   <assert@plt>
L257:
  cmpl   $0x0,-0x18(%rbp)
  jne    L173
  cmpl   $0x0,-0x14(%rbp)
  sete   %al
  movzbl %al,%eax
  mov    %eax,%edi
  call   <assert@plt>
L173:
  addl   $0x1,-0x1c(%rbp)
L92:
  cmpl   $0x100,-0x1c(%rbp)
  jle    L253
  movl   $0x30,-0x1c(%rbp)
  jmp    L83
L69:
  mov    -0x1c(%rbp),%eax
  mov    %eax,%edi
  call   <skiboot_isspace@plt>
  test   %eax,%eax
  sete   %al
  movzbl %al,%eax
  mov    %eax,%edi
  call   <assert@plt>
  addl   $0x1,-0x1c(%rbp)
L83:
  cmpl   $0x39,-0x1c(%rbp)
  jle    L69
  mov    $0xc,%edi
  call   <skiboot_isspace@plt>
  mov    %eax,%edi
  call   <assert@plt>
  mov    $0xa,%edi
  call   <skiboot_isspace@plt>
  mov    %eax,%edi
  call   <assert@plt>
  mov    $0x20,%edi
  call   <skiboot_isspace@plt>
  mov    %eax,%edi
  call   <assert@plt>
  movl   $0x0,-0x1c(%rbp)
  jmp    L40
L108:
  mov    -0x1c(%rbp),%eax
  mov    %eax,%edi
  call   <skiboot_isspace@plt>
  mov    %eax,-0x18(%rbp)
  mov    -0x1c(%rbp),%eax
  mov    %eax,%edi
  call   <isspace@plt>
  mov    %eax,-0x14(%rbp)
  cmpl   $0x0,-0x18(%rbp)
  je     L111
  mov    -0x14(%rbp),%eax
  mov    %eax,%edi
  call   <assert@plt>
L111:
  cmpl   $0x0,-0x18(%rbp)
  jne    L91
  cmpl   $0x0,-0x14(%rbp)
  sete   %al
  movzbl %al,%eax
  mov    %eax,%edi
  call   <assert@plt>
L91:
  addl   $0x1,-0x1c(%rbp)
L40:
  cmpl   $0x100,-0x1c(%rbp)
  jle    L108
  movl   $0x30,-0x1c(%rbp)
  jmp    L26
L207:
  mov    -0x1c(%rbp),%eax
  mov    %eax,%edi
  call   <skiboot_isxdigit@plt>
  mov    %eax,%edi
  call   <assert@plt>
  addl   $0x1,-0x1c(%rbp)
L26:
  cmpl   $0x39,-0x1c(%rbp)
  jle    L207
  mov    $0x61,%edi
  call   <skiboot_isxdigit@plt>
  mov    %eax,%edi
  call   <assert@plt>
  mov    $0x41,%edi
  call   <skiboot_isxdigit@plt>
  mov    %eax,%edi
  call   <assert@plt>
  mov    $0x46,%edi
  call   <skiboot_isxdigit@plt>
  mov    %eax,%edi
  call   <assert@plt>
  mov    $0x5a,%edi
  call   <skiboot_isxdigit@plt>
  test   %eax,%eax
  sete   %al
  movzbl %al,%eax
  mov    %eax,%edi
  call   <assert@plt>
  movl   $0x0,-0x1c(%rbp)
  jmp    L75
L2:
  mov    -0x1c(%rbp),%eax
  mov    %eax,%edi
  call   <skiboot_isxdigit@plt>
  mov    %eax,-0x18(%rbp)
  mov    -0x1c(%rbp),%eax
  mov    %eax,%edi
  call   <isxdigit@plt>
  mov    %eax,-0x14(%rbp)
  cmpl   $0x0,-0x18(%rbp)
  je     L266
  mov    -0x14(%rbp),%eax
  mov    %eax,%edi
  call   <assert@plt>
L266:
  cmpl   $0x0,-0x18(%rbp)
  jne    L153
  cmpl   $0x0,-0x14(%rbp)
  sete   %al
  movzbl %al,%eax
  mov    %eax,%edi
  call   <assert@plt>
L153:
  addl   $0x1,-0x1c(%rbp)
L75:
  cmpl   $0x100,-0x1c(%rbp)
  jle    L2
  movl   $0x0,-0x1c(%rbp)
  jmp    L200
L183:
  mov    -0x1c(%rbp),%eax
  mov    %eax,%edi
  call   <skiboot_tolower@plt>
  mov    %rax,%rbx
  mov    -0x1c(%rbp),%eax
  mov    %eax,%edi
  call   <tolower@plt>
  cmp    %rax,%rbx
  sete   %al
  movzbl %al,%eax
  mov    %eax,%edi
  call   <assert@plt>
  addl   $0x1,-0x1c(%rbp)
L200:
  cmpl   $0x100,-0x1c(%rbp)
  jle    L183
  movl   $0x0,-0x1c(%rbp)
  jmp    L273
L95:
  mov    -0x1c(%rbp),%eax
  mov    %eax,%edi
  call   <skiboot_toupper@plt>
  mov    %rax,%rbx
  mov    -0x1c(%rbp),%eax
  mov    %eax,%edi
  call   <toupper@plt>
  cmp    %rax,%rbx
  sete   %al
  movzbl %al,%eax
  mov    %eax,%edi
  call   <assert@plt>
  addl   $0x1,-0x1c(%rbp)
L273:
  cmpl   $0x100,-0x1c(%rbp)
  jle    L95
  mov    $0x0,%eax
  mov    -0x8(%rbp),%rbx
  leave
  ret
```

assistant: ```c
int main(void) {
  int i;
  int r1, r2;
  for (i = '0'; i <= '9'; i++)
    assert(skiboot_isdigit(i));
  assert(skiboot_isdigit('a') == 0);
  assert(skiboot_isdigit('Z') == 0);
  for (i = 0; i < 257; i++) {
    r1 = skiboot_isdigit(i);
    r2 = isdigit(i);
    if (r1)
      assert(r2);
    if (!r1)
      assert(!r2);
  }
  for (i = '0'; i <= '9'; i++)
    assert(skiboot_isprint(i));
  assert(skiboot_isprint('\0') == 0);
  assert(skiboot_isprint(4) == 0);
  for (i = 0; i < 257; i++) {
    r1 = skiboot_isprint(i);
    r2 = isprint(i);
    if (r1)
      assert(r2);
    if (!r1)
      assert(!r2);
  }
  for (i = '0'; i <= '9'; i++)
    assert(skiboot_isspace(i) == 0);
  assert(skiboot_isspace('\f'));
  assert(skiboot_isspace('\n'));
  assert(skiboot_isspace(' '));
  for (i = 0; i < 257; i++) {
    r1 = skiboot_isspace(i);
    r2 = isspace(i);
    if (r1)
      assert(r2);
    if (!r1)
      assert(!r2);
  }
  for (i = '0'; i <= '9'; i++)
    assert(skiboot_isxdigit(i));
  assert(skiboot_isxdigit('a'));
  assert(skiboot_isxdigit('A'));
  assert(skiboot_isxdigit('F'));
  assert(skiboot_isxdigit('Z') == 0);
  for (i = 0; i < 257; i++) {
    r1 = skiboot_isxdigit(i);
    r2 = isxdigit(i);
    if (r1)
      assert(r2);
    if (!r1)
      assert(!r2);
  }
  for (i = 0; i < 257; i++) {
    assert(skiboot_tolower(i) == tolower(i));
  }
  for (i = 0; i < 257; i++) {
    assert(skiboot_toupper(i) == toupper(i));
  }
  return 0;
}
```