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

```asm
<ParseQueryString>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x110,%rsp
  mov    %rdi,-0x108(%rbp)
  mov    %fs:0x28,%rax
  mov    %rax,-0x8(%rbp)
  xor    %eax,%eax
  movl   $0x1,-0xfc(%rbp)
  movq   $0x0,-0xf0(%rbp)
  movq   $0x0,-0xe8(%rbp)
  lea    -0xe0(%rbp),%rax
  mov    $0x64,%edx
  mov    $0x0,%esi
  mov    %rax,%rdi
  call   <memset@plt>
  lea    -0x70(%rbp),%rax
  mov    $0x64,%edx
  mov    $0x0,%esi
  mov    %rax,%rdi
  call   <memset@plt>
  cmpq   $0x0,-0x108(%rbp)
  je     L86
  mov    -0x108(%rbp),%rax
  mov    %rax,%rdi
  call   <strlen@plt>
  mov    %rax,-0xf8(%rbp)
  jmp    L78
L164:
  mov    -0x108(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x108(%rbp)
  movzbl (%rax),%eax
  mov    %al,-0xfd(%rbp)
  cmpb   $0x3d,-0xfd(%rbp)
  jne    L145
  movl   $0x0,-0xfc(%rbp)
  jmp    L78
L145:
  cmpb   $0x26,-0xfd(%rbp)
  jne    L29
  movl   $0x1,-0xfc(%rbp)
  cmpq   $0x0,-0xf0(%rbp)
  jle    L5
  cmpq   $0x0,-0xe8(%rbp)
  jle    L5
  lea    -0x70(%rbp),%rdx
  lea    -0xe0(%rbp),%rax
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <AddSimParam@plt>
L5:
  lea    -0xe0(%rbp),%rax
  mov    $0x64,%edx
  mov    $0x0,%esi
  mov    %rax,%rdi
  call   <memset@plt>
  lea    -0x70(%rbp),%rax
  mov    $0x64,%edx
  mov    $0x0,%esi
  mov    %rax,%rdi
  call   <memset@plt>
  movq   $0x0,-0xe8(%rbp)
  mov    -0xe8(%rbp),%rax
  mov    %rax,-0xf0(%rbp)
  jmp    L78
L29:
  cmpl   $0x0,-0xfc(%rbp)
  je     L74
  cmpq   $0x1e,-0xf0(%rbp)
  jg     L78
  mov    -0xf0(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0xf0(%rbp)
  movzbl -0xfd(%rbp),%edx
  mov    %dl,-0xe0(%rbp,%rax,1)
  jmp    L78
L74:
  cmpq   $0x3e,-0xe8(%rbp)
  jg     L78
  mov    -0xe8(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0xe8(%rbp)
  movzbl -0xfd(%rbp),%edx
  mov    %dl,-0x70(%rbp,%rax,1)
L78:
  mov    -0xf8(%rbp),%rax
  lea    -0x1(%rax),%rdx
  mov    %rdx,-0xf8(%rbp)
  test   %rax,%rax
  jne    L164
  cmpq   $0x0,-0xf0(%rbp)
  jle    L125
  cmpq   $0x0,-0xe8(%rbp)
  jle    L125
  lea    -0x70(%rbp),%rdx
  lea    -0xe0(%rbp),%rax
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <AddSimParam@plt>
  jmp    L125
L86:
  nop
L125:
  mov    -0x8(%rbp),%rax
  sub    %fs:0x28,%rax
  je     L48
  call   <__stack_chk_fail@plt>
L48:
  leave
  ret
```

assistant: ```c
void ParseQueryString(char *str) {
  int collectname = 1;
  char namebuffer[100], stringbuffer[100], c;
  long length, namelen = 0, stringlen = 0;
  memset(namebuffer, 0, sizeof(namebuffer));
  memset(stringbuffer, 0, sizeof(stringbuffer));
  if (str == NULL)
    return;
  length = (long)strlen(str);
  while (length--) {
    c = *str++;
    if (c == '=') {
      collectname = 0;
    } else if (c == '&') {
      collectname = 1;
      if (namelen > 0 && stringlen > 0) {
        AddSimParam(namebuffer, stringbuffer);
      }
      memset(namebuffer, 0, sizeof(namebuffer));
      memset(stringbuffer, 0, sizeof(stringbuffer));
      namelen = stringlen = 0;
    } else {
      if (collectname) {
        if (namelen < 31)
          namebuffer[namelen++] = c;
      } else {
        if (stringlen < 63)
          stringbuffer[stringlen++] = c;
      }
    }
  }
  if (namelen > 0 && stringlen > 0)
    AddSimParam(namebuffer, stringbuffer);
}
```