user: 这段汇编代码用C语言表示是什么样的？

```asm
<monShell>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  push   %rbx
  sub    $0x158,%rsp
  mov    %rdi,-0x158(%rbp)
  mov    %fs:0x28,%rax
  mov    %rax,-0x18(%rbp)
  xor    %eax,%eax
  movq   $0x0,-0xf0(%rbp)
  movq   $0x0,-0xe8(%rbp)
  movq   $0x0,-0xe0(%rbp)
  movq   $0x0,-0xd8(%rbp)
  movq   $0x0,-0xd0(%rbp)
  movq   $0x0,-0xc8(%rbp)
  movq   $0x0,-0xc0(%rbp)
  movq   $0x0,-0xb8(%rbp)
  movq   $0x0,-0xb0(%rbp)
  movq   $0x0,-0xa8(%rbp)
  movq   $0x0,-0xa0(%rbp)
  movq   $0x0,-0x98(%rbp)
  movl   $0x0,-0x90(%rbp)
  lea    D44(%rip),%rax
  mov    %rax,%rdi
  call   <puts@plt>
  lea    -0x80(%rbp),%rax
  mov    $0x64,%esi
  mov    %rax,%rdi
  call   <getcwd@plt>
  mov    $0x0,%esi
  mov    $0x0,%edi
  call   <getcwd@plt>
  mov    %rax,%rbx
  mov    $0x0,%eax
  call   <getlogin@plt>
  mov    %rbx,%rdx
  mov    %rax,%rsi
  lea    D78(%rip),%rax
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  jmp    L105
L99:
  lea    -0xf0(%rbp),%rax
  mov    %rax,%rdi
  call   <gets@plt>
  lea    -0x140(%rbp),%rdx
  lea    -0xf0(%rbp),%rax
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <lireCommande@plt>
  lea    -0x140(%rbp),%rax
  mov    %rax,%rdi
  call   <rechercheCaractereSpecial@plt>
  mov    %rax,-0x148(%rbp)
  cmpq   $0x0,-0x148(%rbp)
  je     L135
  mov    -0x148(%rbp),%rax
  lea    D42(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strcmp@plt>
  test   %rax,%rax
  jne    L135
  mov    -0x158(%rbp),%rdx
  lea    -0x140(%rbp),%rax
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <executePipe@plt>
  jmp    L8
L135:
  cmpq   $0x0,-0x148(%rbp)
  je     L60
  mov    -0x148(%rbp),%rax
  lea    D2(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strcmp@plt>
  test   %rax,%rax
  jne    L60
  mov    -0x158(%rbp),%rdx
  lea    -0x140(%rbp),%rax
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <executeCommandeSequentielle@plt>
  jmp    L8
L60:
  cmpq   $0x0,-0x148(%rbp)
  je     L43
  mov    -0x148(%rbp),%rax
  lea    D43(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strcmp@plt>
  test   %rax,%rax
  je     L61
  mov    -0x148(%rbp),%rax
  lea    D62(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strcmp@plt>
  test   %rax,%rax
  jne    L43
L61:
  mov    -0x158(%rbp),%rdx
  lea    -0x140(%rbp),%rax
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <modifEntreeSortie@plt>
  jmp    L8
L43:
  mov    -0x140(%rbp),%rax
  mov    %rax,%rdi
  call   <testCommandeInterne@plt>
  test   %rax,%rax
  je     L139
  mov    -0x158(%rbp),%rdx
  lea    -0x140(%rbp),%rax
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <execCommandeInterne@plt>
  jmp    L8
L139:
  lea    -0x140(%rbp),%rax
  mov    %rax,%rdi
  call   <execCommandeExterne@plt>
L8:
  lea    -0x80(%rbp),%rax
  mov    $0x64,%esi
  mov    %rax,%rdi
  call   <getcwd@plt>
  mov    $0x0,%eax
  call   <getlogin@plt>
  mov    %rax,%rcx
  lea    -0x80(%rbp),%rax
  mov    %rax,%rdx
  mov    %rcx,%rsi
  lea    D78(%rip),%rax
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <printf@plt>
L105:
  lea    -0xf0(%rbp),%rax
  lea    D49(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strcmp@plt>
  test   %rax,%rax
  jne    L99
  nop
  mov    -0x18(%rbp),%rax
  sub    %fs:0x28,%rax
  je     L22
  call   <__stack_chk_fail@plt>
L22:
  mov    -0x8(%rbp),%rbx
  leave
  ret
```

tool_calls: name: parse_data
arguments: tag: D44
type: string
name: parse_data
arguments: tag: D78
type: string
name: parse_data
arguments: tag: D42
type: string
name: parse_data
arguments: tag: D2
type: string
name: parse_data
arguments: tag: D43
type: string
name: parse_data
arguments: tag: D62
type: string
name: parse_data
arguments: tag: D49
type: string

tool: D44: Voici mon shell, taper Q pour sortir

tool: D78: %s@[%s]--> 

tool: D42: |

tool: D2: ;

tool: D43: <

tool: D62: >

tool: D49: Q

assistant: ```c
void monShell(char *arge[]) {
  char cmd[100] = "";
  char *com[10];
  char *caractereSpe;
  char prompt[100];
  printf("Voici mon shell, taper Q pour sortir\n");
  getcwd(prompt, 100);
  printf("%s@[%s]--> ", getlogin(), getcwd(NULL, 0));
  while (strcmp(cmd, "Q") != 0) {
    gets(cmd);
    lireCommande(cmd, com);
    caractereSpe = rechercheCaractereSpecial(com);
    if (caractereSpe != NULL && (strcmp(caractereSpe, "|") == 0))
      executePipe(com, arge);
    else if (caractereSpe != NULL && (strcmp(caractereSpe, ";") == 0))
      executeCommandeSequentielle(com, arge);
    else if (caractereSpe != NULL && (strcmp(caractereSpe, "<") == 0 || strcmp(caractereSpe, ">") == 0))
      modifEntreeSortie(com, arge);
    else {
      if (testCommandeInterne(com[0])) {
        execCommandeInterne(com, arge);
      } else {
        execCommandeExterne(com);
      }
    }
    getcwd(prompt, 100);
    printf("%s@[%s]--> ", getlogin(), prompt);
  }
}
```