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

```asm
<proc_node_init>:
  endbr64
  push   %r15
  push   %r14
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  sub    $0xc98,%rsp
  mov    %fs:0x28,%rax
  mov    %rax,0xc88(%rsp)
  xor    %eax,%eax
  call   <get_mem_rate@plt>
  xor    %eax,%eax
  call   <get_mem_total@plt>
  lea    D23(%rip),%rdi
  mov    %rax,0x18(%rsp)
  call   <opendir@plt>
  test   %rax,%rax
  je     L5
  mov    %rax,%r13
  nopl   0x0(%rax)
L59:
  mov    %r13,%rdi
  call   <readdir@plt>
  mov    %rax,%rbx
  test   %rax,%rax
  je     L83
L37:
  mov    (%rbx),%r12
  movsbl (%r12),%edi
  test   %dil,%dil
  jne    L29
  jmp    L58
  nopl   0x0(%rax,%rax,1)
L101:
  movsbl 0x1(%r12),%edi
  add    $0x1,%r12
  test   %dil,%dil
  je     L100
L29:
  call   <isdigit@plt>
  test   %eax,%eax
  jne    L101
  cmpb   $0x0,(%r12)
  jne    L59
  nop
L100:
  mov    (%rbx),%r12
L58:
  lea    0x880(%rsp),%r14
  mov    %r12,%rdx
  lea    D45(%rip),%rsi
  mov    %r14,%rdi
  lea    0x30(%rsp),%r12
  lea    0x80(%rsp),%r15
  call   <sprintf@plt>
  mov    $0x50,%ecx
  mov    %r12,%rdx
  mov    %r14,%rdi
  lea    D33(%rip),%rsi
  lea    0x480(%rsp),%rbp
  call   <file2str@plt>
  mov    $0xa,%esi
  mov    %r12,%rdi
  call   <strchr@plt>
  mov    %r14,%rdx
  lea    D60(%rip),%rsi
  mov    %r15,%rdi
  movb   $0x0,(%rax)
  call   <sprintf@plt>
  xor    %esi,%esi
  mov    $0x400,%edx
  mov    %rbp,%rdi
  call   <memset@plt>
  mov    $0x400,%edx
  mov    %rbp,%rsi
  mov    %r15,%rdi
  call   <readlink@plt>
  cmp    $0xffffffff,%eax
  je     L64
L68:
  lea    D20(%rip),%rsi
  mov    %r14,%rdi
  call   <stat@plt>
  mov    D20(%rip),%edi
  call   <getpwuid@plt>
  mov    0x18(%rsp),%rsi
  lea    0x24(%rsp),%rdx
  mov    %r14,%rdi
  mov    %rax,%r15
  lea    0x28(%rsp),%rcx
  call   <get_process_mem_rate@plt>
  movss  0x24(%rsp),%xmm0
  mov    0x28(%rsp),%r8
  mov    (%r15),%ecx
  mov    (%rbx),%rdi
  mov    %r8,0x8(%rsp)
  mov    %ecx,0x10(%rsp)
  movss  %xmm0,0x14(%rsp)
  call   <atoi@plt>
  mov    0x8(%rsp),%r8
  mov    %r12,%rdx
  mov    %rbp,%rsi
  movss  0x14(%rsp),%xmm0
  mov    0x10(%rsp),%ecx
  mov    %eax,%edi
  call   <proc_node_add@plt>
  mov    %r13,%rdi
  call   <readdir@plt>
  mov    %rax,%rbx
  test   %rax,%rax
  jne    L37
L83:
  mov    %r13,%rdi
  call   <closedir@plt>
L5:
  mov    0xc88(%rsp),%rax
  sub    %fs:0x28,%rax
  jne    L25
  add    $0xc98,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
  nopl   0x0(%rax)
L64:
  mov    %r12,%rdx
  lea    D12(%rip),%rsi
  mov    %rbp,%rdi
  call   <sprintf@plt>
  jmp    L68
L25:
  call   <__stack_chk_fail@plt>
```

tool_calls: name: parse_data
arguments: label: D23
type_guessed: string
name: parse_data
arguments: label: D45
type_guessed: string
name: parse_data
arguments: label: D33
type_guessed: string
name: parse_data
arguments: label: D60
type_guessed: string
name: parse_data
arguments: label: D12
type_guessed: string

tool: D23: /proc/

tool: D45: /proc/%s

tool: D33: comm

tool: D60: %s/exe

tool: D12: [%s]

assistant: ```c
void proc_node_init(void) {
  char buf1[1024], buf2[1024];
  char ProcPath[1024], *ptr, comm[80];
  DIR *db, *directory;
  struct dirent *p;
  float MemUsedRate;
  unsigned long MemTotal;
  MemUsedRate = get_mem_rate();
  MemTotal = get_mem_total();
  db = opendir("/proc/");
  if (db == NULL)
    return;
  while (p = readdir(db)) {
    char *cs;
    for (cs = p->d_name; *cs; cs++)
      if (!isdigit(*cs))
        break;
    if (*cs)
      continue;
    sprintf(ProcPath, "/proc/%s", p->d_name);
    file2str(ProcPath, "comm", comm, sizeof comm);
    ptr = strstr(comm, "\n");
    *ptr = '\0';
    sprintf(buf1, "%s/exe", ProcPath);
    memset(buf2, 0, sizeof(buf2));
    if (readlink(buf1, buf2, sizeof(buf2)) == -1) {
      sprintf(buf2, "[%s]", comm);
    }
    static struct stat sb;
    stat(ProcPath, &sb);
    struct passwd *pw;
    pw = getpwuid(sb.st_uid);
    float ProcMemUsedRate;
    unsigned long ProcMemTotal;
    get_process_mem_rate(ProcPath, MemTotal, &ProcMemUsedRate, &ProcMemTotal);
    proc_node_add(atoi(p->d_name), buf2, comm, pw->pw_name, ProcMemTotal, ProcMemUsedRate);
  }
  closedir(db);
}
```