user: 请将以下的汇编代码转换成C语言代码：

```asm
<parse_line>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x60,%rsp
  mov    %rdi,-0x58(%rbp)
  mov    %rsi,-0x60(%rbp)
  movq   $0x0,-0x48(%rbp)
  movq   $0x0,-0x40(%rbp)
  movq   $0x0,-0x38(%rbp)
  movq   $0x0,-0x30(%rbp)
  movq   $0x0,-0x28(%rbp)
  movq   $0x0,-0x20(%rbp)
  movq   $0x0,-0x18(%rbp)
  mov    -0x58(%rbp),%rax
  movzbl (%rax),%eax
  movsbl %al,%eax
  mov    %eax,%esi
  lea    D47(%rip),%rax
  mov    %rax,%rdi
  call   <strchr@plt>
  test   %rax,%rax
  je     L11
  mov    -0x58(%rbp),%rax
  lea    D47(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strtok@plt>
  mov    %rax,-0x40(%rbp)
  mov    -0x40(%rbp),%rax
  mov    %rax,%rsi
  lea    D13(%rip),%rax
  mov    %rax,%rdi
  call   <printf@plt>
L11:
  mov    -0x58(%rbp),%rax
  movzbl (%rax),%eax
  cmp    $0x9,%al
  je     L13
  mov    -0x58(%rbp),%rax
  movzbl (%rax),%eax
  cmp    $0x20,%al
  jne    L46
L13:
  movl   $0x0,-0x4c(%rbp)
  jmp    L9
L2:
  mov    -0x58(%rbp),%rax
  lea    D48(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strtok@plt>
  mov    %rax,-0x48(%rbp)
  mov    -0x48(%rbp),%rax
  mov    %rax,%rsi
  lea    D84(%rip),%rax
  mov    %rax,%rdi
  call   <printf@plt>
  lea    D48(%rip),%rax
  mov    %rax,%rsi
  mov    $0x0,%edi
  call   <strtok@plt>
  mov    %rax,-0x10(%rbp)
  mov    -0x10(%rbp),%rax
  mov    %rax,%rsi
  lea    D67(%rip),%rax
  mov    %rax,%rdi
  call   <printf@plt>
  lea    D48(%rip),%rax
  mov    %rax,%rsi
  mov    $0x0,%edi
  call   <strtok@plt>
  mov    %rax,-0x8(%rbp)
  mov    -0x8(%rbp),%rax
  mov    %rax,%rsi
  lea    D96(%rip),%rax
  mov    %rax,%rdi
  call   <printf@plt>
  lea    D48(%rip),%rax
  mov    %rax,%rsi
  mov    $0x0,%edi
  call   <strtok@plt>
  mov    %rax,-0x30(%rbp)
  mov    -0x30(%rbp),%rax
  mov    %rax,%rsi
  lea    D40(%rip),%rax
  mov    %rax,%rdi
  call   <printf@plt>
  addl   $0x1,-0x4c(%rbp)
L9:
  cmpl   $0x0,-0x4c(%rbp)
  je     L2
L46:
  mov    $0x0,%eax
  leave
  ret
```

tool_calls: name: read_data
arguments: label: D47
type: string
name: read_data
arguments: label: D13
type: string
name: read_data
arguments: label: D48
type: string
name: read_data
arguments: label: D84
type: string
name: read_data
arguments: label: D67
type: string
name: read_data
arguments: label: D96
type: string
name: read_data
arguments: label: D40
type: string

tool: D47: !

tool: D13: COMMAND : %s

tool: D48:  

tool: D84: INSTR : %s


tool: D67: ARG1 : %s


tool: D96: ARG2 : %s


tool: D40: ARG3 : %s


assistant: ```c
int parse_line(char *line, unsigned buff[]) {
  char *instr = NULL;
  char *cmd = NULL;
  char *reg = NULL;
  char *arg1, *arg2, *arg3 = NULL;
  char *ls_reg = NULL;
  char *op_regs = NULL;
  char *val = NULL;
  if (strchr("!", *line)) {
    cmd = strtok(line, "!");
    printf("COMMAND : %s", cmd);
  }
  if (line[0] == '\t' || line[0] == ' ') {
    int i = 0;
    while (i < sizeof(line) / sizeof(char *)) {
      instr = strtok(line, " ");
      printf("INSTR : %s\n", instr);
      arg1 = strtok(NULL, " ");
      printf("ARG1 : %s\n", arg1);
      arg2 = strtok(NULL, " ");
      printf("ARG2 : %s\n", arg2);
      arg3 = strtok(NULL, " ");
      printf("ARG3 : %s\n", arg3);
      i++;
    }
  }
  return 0;
}
```