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

```asm
<fig08_04>:
  endbr64
  push   %rbp
  push   %rbx
  sub    $0x8,%rsp
  mov    $0x25,%edi
  call   <isspace@plt>
  test   %rax,%rax
  lea    D335(%rip),%rbp
  lea    D260(%rip),%rax
  cmove  %rax,%rbp
  mov    $0x9,%edi
  call   <isspace@plt>
  test   %rax,%rax
  lea    D409(%rip),%rbx
  lea    D394(%rip),%rax
  cmove  %rax,%rbx
  mov    $0xa,%edi
  call   <isspace@plt>
  test   %rax,%rax
  lea    D409(%rip),%rcx
  lea    D394(%rip),%rax
  cmove  %rax,%rcx
  lea    D328(%rip),%r8
  push   %r8
  push   %rbp
  push   %r8
  push   %rbx
  lea    D143(%rip),%r9
  lea    D38(%rip),%rdx
  lea    D8(%rip),%rsi
  lea    D287(%rip),%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  add    $0x20,%rsp
  mov    $0x24,%edi
  call   <iscntrl@plt>
  test   %rax,%rax
  lea    D145(%rip),%rbx
  lea    D114(%rip),%rax
  cmove  %rax,%rbx
  mov    $0xa,%edi
  call   <iscntrl@plt>
  test   %rax,%rax
  lea    D409(%rip),%rcx
  lea    D394(%rip),%rax
  cmove  %rax,%rcx
  sub    $0x8,%rsp
  lea    D277(%rip),%r8
  push   %r8
  mov    %rbx,%r9
  lea    D38(%rip),%rdx
  lea    D163(%rip),%rsi
  lea    D331(%rip),%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  mov    $0x23,%edi
  call   <ispunct@plt>
  add    $0x10,%rsp
  test   %rax,%rax
  lea    D151(%rip),%rbp
  lea    D229(%rip),%rax
  cmove  %rax,%rbp
  mov    $0x59,%edi
  call   <ispunct@plt>
  test   %rax,%rax
  lea    D255(%rip),%rbx
  lea    D416(%rip),%rax
  cmove  %rax,%rbx
  mov    $0x3b,%edi
  call   <ispunct@plt>
  test   %rax,%rax
  lea    D377(%rip),%rdx
  lea    D415(%rip),%rax
  cmove  %rax,%rdx
  lea    D0(%rip),%rcx
  push   %rcx
  push   %rbp
  mov    %rcx,%r9
  mov    %rbx,%r8
  lea    D362(%rip),%rsi
  lea    D360(%rip),%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  mov    $0x7,%edi
  call   <isprint@plt>
  add    $0x10,%rsp
  test   %rax,%rax
  lea    D409(%rip),%rbx
  lea    D394(%rip),%rax
  cmove  %rax,%rbx
  mov    $0x24,%edi
  call   <isprint@plt>
  test   %rax,%rax
  lea    D145(%rip),%rdx
  lea    D114(%rip),%rax
  cmove  %rax,%rdx
  sub    $0x8,%rsp
  lea    D141(%rip),%rcx
  push   %rcx
  mov    %rbx,%r9
  lea    D307(%rip),%r8
  lea    D313(%rip),%rsi
  lea    D296(%rip),%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  mov    $0x20,%edi
  call   <isgraph@plt>
  add    $0x10,%rsp
  test   %rax,%rax
  lea    D409(%rip),%rbx
  lea    D394(%rip),%rax
  cmove  %rax,%rbx
  mov    $0x51,%edi
  call   <isgraph@plt>
  test   %rax,%rax
  lea    D109(%rip),%rdx
  lea    D434(%rip),%rax
  cmove  %rax,%rdx
  sub    $0x8,%rsp
  lea    D438(%rip),%rcx
  push   %rcx
  mov    %rbx,%r9
  lea    D196(%rip),%r8
  lea    D127(%rip),%rsi
  lea    D373(%rip),%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  add    $0x18,%rsp
  pop    %rbx
  pop    %rbp
  ret
```

tool_calls: name: disassemble_data
arguments: label: D335
datatype: string
name: disassemble_data
arguments: label: D260
datatype: string
name: disassemble_data
arguments: label: D409
datatype: string
name: disassemble_data
arguments: label: D394
datatype: string
name: disassemble_data
arguments: label: D328
datatype: string
name: disassemble_data
arguments: label: D143
datatype: string
name: disassemble_data
arguments: label: D38
datatype: string
name: disassemble_data
arguments: label: D8
datatype: string
name: disassemble_data
arguments: label: D287
datatype: string
name: disassemble_data
arguments: label: D145
datatype: string
name: disassemble_data
arguments: label: D114
datatype: string
name: disassemble_data
arguments: label: D277
datatype: string
name: disassemble_data
arguments: label: D163
datatype: string
name: disassemble_data
arguments: label: D331
datatype: string
name: disassemble_data
arguments: label: D151
datatype: string
name: disassemble_data
arguments: label: D229
datatype: string
name: disassemble_data
arguments: label: D255
datatype: string
name: disassemble_data
arguments: label: D416
datatype: string
name: disassemble_data
arguments: label: D377
datatype: string
name: disassemble_data
arguments: label: D415
datatype: string
name: disassemble_data
arguments: label: D0
datatype: string
name: disassemble_data
arguments: label: D362
datatype: string
name: disassemble_data
arguments: label: D360
datatype: string
name: disassemble_data
arguments: label: D141
datatype: string
name: disassemble_data
arguments: label: D307
datatype: string
name: disassemble_data
arguments: label: D313
datatype: string
name: disassemble_data
arguments: label: D296
datatype: string
name: disassemble_data
arguments: label: D109
datatype: string
name: disassemble_data
arguments: label: D434
datatype: string
name: disassemble_data
arguments: label: D438
datatype: string
name: disassemble_data
arguments: label: D196
datatype: string
name: disassemble_data
arguments: label: D127
datatype: string
name: disassemble_data
arguments: label: D373
datatype: string

tool: D335: % is a 

tool: D260: % is not a 

tool: D409:  is a 

tool: D394:  is not a 

tool: D328: whitespace character

tool: D143: Horizontal tab

tool: D38: Newline

tool: D8: According to isspace:

tool: D287: %s
%s%s%s
%s%s%s
%s%s



tool: D145: $ is a 

tool: D114: $ is not a 

tool: D277: control character

tool: D163: According to iscntrl:

tool: D331: %s
%s%s%s
%s%s



tool: D151: # is a 

tool: D229: # is not a 

tool: D255: Y is a 

tool: D416: Y is not a 

tool: D377: ; is a 

tool: D415: ; is not a 

tool: D0: punctuation character

tool: D362: According to ispunct:

tool: D360: %s
%s%s
%s%s
%s%s



tool: D141: printing character

tool: D307: Alert

tool: D313: According to isprint:

tool: D296: %s
%s%s
%s%s%s



tool: D109: Q is a 

tool: D434: Q is not a 

tool: D438: printing character other than a space

tool: D196: Space

tool: D127: According to isgraph:

tool: D373: %s
%s%s
%s%s%s


assistant: ```c
void fig08_04() {
  printf("%s\n%s%s%s\n%s%s%s\n%s%s\n\n", "According to isspace:", "Newline", isspace('\n') ? " is a " : " is not a ", "whitespace character", "Horizontal tab", isspace('\t') ? " is a " : " is not a ", "whitespace character", isspace('%') ? "% is a " : "% is not a ", "whitespace character");
  printf("%s\n%s%s%s\n%s%s\n\n", "According to iscntrl:", "Newline", iscntrl('\n') ? " is a " : " is not a ", "control character", iscntrl('$') ? "$ is a " : "$ is not a ", "control character");
  printf("%s\n%s%s\n%s%s\n%s%s\n\n", "According to ispunct:", ispunct(';') ? "; is a " : "; is not a ", "punctuation character", ispunct('Y') ? "Y is a " : "Y is not a ", "punctuation character", ispunct('#') ? "# is a " : "# is not a ", "punctuation character");
  printf("%s\n%s%s\n%s%s%s\n\n", "According to isprint:", isprint('$') ? "$ is a " : "$ is not a ", "printing character", "Alert", isprint('\a') ? " is a " : " is not a ", "printing character");
  printf("%s\n%s%s\n%s%s%s\n", "According to isgraph:", isgraph('Q') ? "Q is a " : "Q is not a ", "printing character other than a space", "Space", isgraph(' ') ? " is a " : " is not a ", "printing character other than a space");
}
```