user: 请显示与下面列出的汇编代码相匹配的C语言实现:

```asm
<main>:
  endbr64
  push   %rbx
  mov    %rsi,%rbx
  cmp    $0x1,%edi
  jle    L40
L78:
  mov    0x8(%rbx),%rdi
  call   <getpwnam@plt>
  mov    %rax,%rbx
  test   %rax,%rax
  je     L48
L25:
  mov    (%rbx),%rsi
  lea    D100(%rip),%rdi
  xor    %eax,%eax
  call   <printf@plt>
  mov    0x8(%rbx),%rsi
  lea    D14(%rip),%rdi
  xor    %eax,%eax
  call   <printf@plt>
  mov    0x10(%rbx),%rsi
  lea    D115(%rip),%rdi
  xor    %eax,%eax
  call   <printf@plt>
  mov    0x18(%rbx),%rsi
  lea    D125(%rip),%rdi
  xor    %eax,%eax
  call   <printf@plt>
  mov    0x20(%rbx),%rsi
  lea    D49(%rip),%rdi
  xor    %eax,%eax
  call   <printf@plt>
  mov    0x28(%rbx),%esi
  lea    D16(%rip),%rdi
  xor    %eax,%eax
  call   <printf@plt>
  mov    0x2c(%rbx),%esi
  lea    D124(%rip),%rdi
  xor    %eax,%eax
  lea    D18(%rip),%rbx
  call   <printf@plt>
  lea    D98(%rip),%rdi
  call   <puts@plt>
  jmp    L61
  cs nopw 0x0(%rax,%rax,1)
L29:
  mov    0x20(%rax),%rcx
  mov    0x18(%rax),%rdx
  mov    %rbx,%rdi
  mov    0x2c(%rax),%r9d
  mov    0x28(%rax),%r8d
  mov    (%rax),%rsi
  xor    %eax,%eax
  call   <printf@plt>
L61:
  xor    %eax,%eax
  call   <getpwent@plt>
  test   %rax,%rax
  jne    L29
  lea    D38(%rip),%rdi
  lea    D50(%rip),%rbx
  call   <puts@plt>
  jmp    L64
  xchg   %ax,%ax
L79:
  mov    0x8(%rax),%rdx
  mov    (%rax),%rsi
  mov    %rbx,%rdi
  xor    %eax,%eax
  call   <printf@plt>
L64:
  xor    %eax,%eax
  call   <getspent@plt>
  test   %rax,%rax
  jne    L79
  pop    %rbx
  ret
L40:
  mov    (%rsi),%rsi
  lea    D96(%rip),%rdi
  xor    %eax,%eax
  call   <printf@plt>
  mov    $0x1,%edi
  call   <exit@plt>
  jmp    L78
L48:
  lea    D75(%rip),%rdi
  call   <perror@plt>
  mov    $0x1,%edi
  call   <exit@plt>
  jmp    L25
```

tool_calls: name: read_data
arguments: tag: D100
datatype: string
name: read_data
arguments: tag: D14
datatype: string
name: read_data
arguments: tag: D115
datatype: string
name: read_data
arguments: tag: D125
datatype: string
name: read_data
arguments: tag: D49
datatype: string
name: read_data
arguments: tag: D16
datatype: string
name: read_data
arguments: tag: D124
datatype: string
name: read_data
arguments: tag: D18
datatype: string
name: read_data
arguments: tag: D98
datatype: string
name: read_data
arguments: tag: D38
datatype: string
name: read_data
arguments: tag: D50
datatype: string
name: read_data
arguments: tag: D96
datatype: string
name: read_data
arguments: tag: D75
datatype: string

tool: D100: pw_name: %s


tool: D14: pw_passwd: %s


tool: D115: pw_gecos: %s


tool: D125: pw_dir: %s


tool: D49: pw_shell: %s


tool: D16: pw_uid: %d


tool: D124: pw_gid: %d


tool: D18: %20s : %32s : %32s : %6d : %6d


tool: D98: ===================================

tool: D38: shadow===================================

tool: D50: [%s] : [%s]


tool: D96: Usage: %s username


tool: D75: get user information error

assistant: ```c
int main(int argc, char *argv[]) {
  struct passwd *pwd;
  struct spwd *spw;
  if (argc < 2) {
    printf("Usage: %s username\n", argv[0]);
    exit(1);
  }
  pwd = getpwnam(argv[1]);
  if (pwd == NULL) {
    perror("get user information error");
    exit(1);
  }
  printf("pw_name: %s\n", pwd->pw_name);
  printf("pw_passwd: %s\n", pwd->pw_passwd);
  printf("pw_gecos: %s\n", pwd->pw_gecos);
  printf("pw_dir: %s\n", pwd->pw_dir);
  printf("pw_shell: %s\n", pwd->pw_shell);
  printf("pw_uid: %d\n", pwd->pw_uid);
  printf("pw_gid: %d\n", pwd->pw_gid);
  printf("===================================\n");
  while ((pwd = getpwent()) != NULL) {
    printf("%20s : %32s : %32s : %6d : %6d\n", pwd->pw_name, pwd->pw_dir, pwd->pw_shell, pwd->pw_uid, pwd->pw_gid);
  }
  printf("shadow===================================\n");
  while ((spw = getspent()) != NULL) {
    printf("[%s] : [%s]\n", spw->sp_namp, spw->sp_pwdp);
  }
  return 0;
}
```