user: Demonstrate the C code that generates the assembly output below:

```asm
<main>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x20,%rsp
  mov    %edi,-0x14(%rbp)
  mov    %rsi,-0x20(%rbp)
  lea    D158(%rip),%rax
  mov    %rax,%rdi
  call   <puts@plt>
  lea    D40(%rip),%rax
  mov    %rax,%rdi
  call   <puts@plt>
  mov    $0x0,%eax
  call   <show_env@plt>
  lea    D8(%rip),%rax
  mov    %rax,%rdi
  call   <puts@plt>
  mov    $0x1,%edx
  lea    D177(%rip),%rax
  mov    %rax,%rsi
  lea    D100(%rip),%rax
  mov    %rax,%rdi
  call   <setenv@plt>
  mov    $0x0,%eax
  call   <show_env@plt>
  lea    D109(%rip),%rax
  mov    %rax,%rdi
  call   <puts@plt>
  mov    $0x1,%edx
  lea    D85(%rip),%rax
  mov    %rax,%rsi
  lea    D100(%rip),%rax
  mov    %rax,%rdi
  call   <setenv@plt>
  mov    $0x0,%eax
  call   <show_env@plt>
  lea    D187(%rip),%rax
  mov    %rax,%rdi
  call   <puts@plt>
  mov    $0x0,%edx
  lea    D177(%rip),%rax
  mov    %rax,%rsi
  lea    D100(%rip),%rax
  mov    %rax,%rdi
  call   <setenv@plt>
  mov    $0x0,%eax
  call   <show_env@plt>
  lea    D140(%rip),%rax
  mov    %rax,%rdi
  call   <puts@plt>
  mov    $0x0,%edx
  lea    D177(%rip),%rax
  mov    %rax,%rsi
  lea    D100(%rip),%rax
  mov    %rax,%rdi
  call   <setenv@plt>
  mov    $0x0,%eax
  call   <show_env@plt>
  lea    D110(%rip),%rax
  mov    %rax,%rdi
  call   <puts@plt>
  lea    D60(%rip),%rax
  mov    %rax,%rdi
  call   <getenv@plt>
  mov    %rax,-0x8(%rbp)
  cmpq   $0x0,-0x8(%rbp)
  je     L5
  mov    $0x0,%eax
  call   <oops@plt>
L5:
  lea    D69(%rip),%rax
  mov    %rax,%rdi
  call   <puts@plt>
  lea    D100(%rip),%rax
  mov    %rax,%rdi
  call   <getenv@plt>
  mov    %rax,-0x8(%rbp)
  cmpq   $0x0,-0x8(%rbp)
  jne    L3
  mov    $0x0,%eax
  call   <oops@plt>
L3:
  mov    -0x8(%rbp),%rax
  mov    %rax,%rsi
  lea    D143(%rip),%rax
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  lea    D107(%rip),%rax
  mov    %rax,%rdi
  call   <puts@plt>
  lea    D112(%rip),%rax
  mov    %rax,%rdi
  call   <putenv@plt>
  mov    $0x0,%eax
  call   <show_env@plt>
  lea    D201(%rip),%rax
  mov    %rax,%rdi
  call   <puts@plt>
  lea    D217(%rip),%rax
  mov    %rax,%rdi
  call   <putenv@plt>
  mov    $0x0,%eax
  call   <show_env@plt>
  mov    $0x0,%edi
  call   <exit@plt>
  mov    $0x0,%eax
  leave
  ret
```

tool_calls: name: disassemble_data
arguments: label: D158
datatype: string
name: disassemble_data
arguments: label: D40
datatype: string
name: disassemble_data
arguments: label: D8
datatype: string
name: disassemble_data
arguments: label: D177
datatype: string
name: disassemble_data
arguments: label: D100
datatype: string
name: disassemble_data
arguments: label: D109
datatype: string
name: disassemble_data
arguments: label: D85
datatype: string
name: disassemble_data
arguments: label: D187
datatype: string
name: disassemble_data
arguments: label: D140
datatype: string
name: disassemble_data
arguments: label: D110
datatype: string
name: disassemble_data
arguments: label: D60
datatype: string
name: disassemble_data
arguments: label: D69
datatype: string
name: disassemble_data
arguments: label: D143
datatype: string
name: disassemble_data
arguments: label: D107
datatype: string
name: disassemble_data
arguments: label: D112
datatype: string
name: disassemble_data
arguments: label: D201
datatype: string
name: disassemble_data
arguments: label: D217
datatype: string

tool: D158: test environment variables

tool: D40: show env

tool: D8: setenv-1

tool: D177: /boot

tool: D100: PATH

tool: D109: setenv-2

tool: D85: /boot:/bin

tool: D187: setenv-3

tool: D140: setenv-4

tool: D110: getenv-1

tool: D60: TMP

tool: D69: getenv-2

tool: D143: PATH=%s


tool: D107: putenv-1

tool: D112: TMP=/tmp

tool: D201: putenv-2

tool: D217: ABC=/abc

assistant: ```c
int main(int argc, char *argv[]) {
  char *val;
  printf("test environment variables\n");
  printf("show env\n");
  show_env();
  printf("setenv-1\n");
  setenv("PATH", "/boot", 1);
  show_env();
  printf("setenv-2\n");
  setenv("PATH", "/boot:/bin", 1);
  show_env();
  printf("setenv-3\n");
  setenv("PATH", "/boot", 0);
  show_env();
  printf("setenv-4\n");
  setenv("PATH", "/boot", 0);
  show_env();
  printf("getenv-1\n");
  val = getenv("TMP");
  if (val != NULL)
    oops();
  printf("getenv-2\n");
  val = getenv("PATH");
  if (val == NULL)
    oops();
  printf("PATH=%s\n", val);
  printf("putenv-1\n");
  putenv("TMP=/tmp");
  show_env();
  printf("putenv-2\n");
  putenv("ABC=/abc");
  show_env();
  exit(0);
}
```