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

```asm
<test8>:
  endbr64
  push   %r15
  lea    D57(%rip),%r15
  push   %r14
  lea    D134(%rip),%r14
  push   %r13
  lea    D80(%rip),%r13
  push   %r12
  lea    D344(%rip),%r12
  push   %rbp
  lea    D237(%rip),%rbp
  push   %rbx
  lea    D346(%rip),%rbx
  sub    $0x28,%rsp
  mov    %fs:0x28,%rax
  mov    %rax,0x18(%rsp)
  xor    %eax,%eax
  lea    0x8(%rsp),%rdi
  call   <KeyVal_new@plt>
  lea    D126(%rip),%rsi
  movzbl %al,%edi
  call   <_check_err@plt>
  mov    0x8(%rsp),%rdi
  lea    D248(%rip),%rdx
  lea    D120(%rip),%rsi
  call   <KeyVal_setValue@plt>
  mov    %rbp,%rsi
  movzbl %al,%edi
  call   <_check_err@plt>
  mov    0x8(%rsp),%rdi
  lea    D4(%rip),%rdx
  mov    %r12,%rsi
  call   <KeyVal_setValue@plt>
  mov    %rbp,%rsi
  movzbl %al,%edi
  call   <_check_err@plt>
  mov    0x8(%rsp),%rdi
  lea    D156(%rip),%rdx
  mov    %rbx,%rsi
  call   <KeyVal_setValue@plt>
  mov    %rbp,%rsi
  movzbl %al,%edi
  call   <_check_err@plt>
  mov    0x8(%rsp),%rdi
  lea    D189(%rip),%rdx
  mov    %r15,%rsi
  call   <KeyVal_setValue@plt>
  mov    %rbp,%rsi
  movzbl %al,%edi
  call   <_check_err@plt>
  mov    0x8(%rsp),%rdi
  lea    D98(%rip),%rdx
  mov    %r14,%rsi
  call   <KeyVal_setValue@plt>
  mov    %rbp,%rsi
  movzbl %al,%edi
  call   <_check_err@plt>
  mov    0x8(%rsp),%rdi
  lea    D400(%rip),%rdx
  mov    %r13,%rsi
  call   <KeyVal_setValue@plt>
  mov    %rbp,%rsi
  movzbl %al,%edi
  call   <_check_err@plt>
  mov    0x8(%rsp),%rdi
  lea    D232(%rip),%rdx
  lea    D218(%rip),%rsi
  call   <KeyVal_setValue@plt>
  mov    %rbp,%rsi
  movzbl %al,%edi
  call   <_check_err@plt>
  mov    0x8(%rsp),%rdi
  lea    D311(%rip),%rdx
  lea    D67(%rip),%rsi
  call   <KeyVal_setValue@plt>
  mov    %rbp,%rsi
  movzbl %al,%edi
  call   <_check_err@plt>
  mov    0x8(%rsp),%rdi
  lea    D245(%rip),%rdx
  lea    D368(%rip),%rsi
  call   <KeyVal_setValue@plt>
  mov    %rbp,%rsi
  movzbl %al,%edi
  call   <_check_err@plt>
  mov    0x8(%rsp),%rdi
  lea    D73(%rip),%rdx
  lea    D81(%rip),%rsi
  call   <KeyVal_setValue@plt>
  mov    %rbp,%rsi
  lea    0x10(%rsp),%rbp
  movzbl %al,%edi
  call   <_check_err@plt>
  mov    0x8(%rsp),%rsi
  mov    %r12,%rdx
  mov    %rbp,%rdi
  mov    $0x1,%ecx
  lea    D32(%rip),%r12
  call   <KeyVal_getValue@plt>
  mov    %r12,%rsi
  movzbl %al,%edi
  call   <_check_err@plt>
  mov    0x10(%rsp),%rdi
  lea    D272(%rip),%rsi
  call   <strcmp@plt>
  xor    %edi,%edi
  lea    D214(%rip),%rsi
  test   %rax,%rax
  sete   %dil
  call   <ok@plt>
  test   %eax,%eax
  je     L5
L9:
  mov    0x10(%rsp),%rdi
  call   <free@plt>
  mov    0x8(%rsp),%rsi
  mov    %rbx,%rdx
  mov    %rbp,%rdi
  mov    $0x1,%ecx
  call   <KeyVal_getValue@plt>
  mov    %r12,%rsi
  movzbl %al,%edi
  call   <_check_err@plt>
  mov    0x10(%rsp),%rdi
  lea    D76(%rip),%rsi
  call   <strcmp@plt>
  xor    %edi,%edi
  lea    D166(%rip),%rsi
  test   %rax,%rax
  sete   %dil
  call   <ok@plt>
  mov    0x10(%rsp),%rdi
  call   <free@plt>
  mov    0x8(%rsp),%rsi
  mov    %r15,%rdx
  mov    %rbp,%rdi
  mov    $0x1,%ecx
  call   <KeyVal_getValue@plt>
  mov    %r12,%rsi
  movzbl %al,%edi
  call   <_check_err@plt>
  mov    0x10(%rsp),%rdi
  lea    D215(%rip),%rsi
  call   <strcmp@plt>
  xor    %edi,%edi
  lea    D150(%rip),%rsi
  test   %rax,%rax
  sete   %dil
  call   <ok@plt>
  mov    0x10(%rsp),%rdi
  call   <free@plt>
  mov    0x8(%rsp),%rsi
  mov    %r14,%rdx
  mov    %rbp,%rdi
  mov    $0x1,%ecx
  call   <KeyVal_getValue@plt>
  mov    %r12,%rsi
  movzbl %al,%edi
  call   <_check_err@plt>
  mov    0x10(%rsp),%rdi
  lea    D345(%rip),%rsi
  call   <strcmp@plt>
  xor    %edi,%edi
  lea    D147(%rip),%rsi
  test   %rax,%rax
  sete   %dil
  call   <ok@plt>
  mov    0x10(%rsp),%rdi
  call   <free@plt>
  mov    0x8(%rsp),%rsi
  mov    %r13,%rdx
  mov    %rbp,%rdi
  mov    $0x1,%ecx
  call   <KeyVal_getValue@plt>
  mov    %r12,%rsi
  movzbl %al,%edi
  call   <_check_err@plt>
  mov    0x10(%rsp),%rdi
  lea    D272(%rip),%rsi
  call   <strcmp@plt>
  xor    %edi,%edi
  lea    D253(%rip),%rsi
  test   %rax,%rax
  sete   %dil
  call   <ok@plt>
  mov    0x10(%rsp),%rdi
  call   <free@plt>
  mov    0x8(%rsp),%rsi
  mov    $0x1,%ecx
  mov    %rbp,%rdi
  lea    D218(%rip),%rdx
  call   <KeyVal_getValue@plt>
  mov    %r12,%rsi
  movzbl %al,%edi
  call   <_check_err@plt>
  mov    0x10(%rsp),%rdi
  lea    D232(%rip),%rsi
  call   <strcmp@plt>
  xor    %edi,%edi
  lea    D97(%rip),%rsi
  test   %rax,%rax
  sete   %dil
  call   <ok@plt>
  mov    0x10(%rsp),%rdi
  call   <free@plt>
  mov    0x8(%rsp),%rsi
  mov    $0x1,%ecx
  mov    %rbp,%rdi
  lea    D67(%rip),%rdx
  call   <KeyVal_getValue@plt>
  mov    %r12,%rsi
  movzbl %al,%edi
  call   <_check_err@plt>
  mov    0x10(%rsp),%rdi
  lea    D311(%rip),%rsi
  call   <strcmp@plt>
  xor    %edi,%edi
  lea    D282(%rip),%rsi
  test   %rax,%rax
  sete   %dil
  call   <ok@plt>
  mov    0x10(%rsp),%rdi
  call   <free@plt>
  mov    0x8(%rsp),%rsi
  mov    $0x1,%ecx
  mov    %rbp,%rdi
  lea    D368(%rip),%rdx
  call   <KeyVal_getValue@plt>
  xor    %edi,%edi
  lea    D361(%rip),%rsi
  cmp    $0x2,%al
  sete   %dil
  call   <ok@plt>
  mov    0x8(%rsp),%rdi
  call   <KeyVal_delete@plt>
  lea    D167(%rip),%rsi
  movzbl %al,%edi
  call   <_check_err@plt>
  mov    0x18(%rsp),%rax
  sub    %fs:0x28,%rax
  jne    L27
  add    $0x28,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
L5:
  mov    0x10(%rsp),%rsi
  lea    D58(%rip),%rdi
  call   <printf@plt>
  jmp    L9
L27:
  call   <__stack_chk_fail@plt>
```

tool_calls: name: extract_symbolic_data
arguments: data_label: D57
type: string
name: extract_symbolic_data
arguments: data_label: D134
type: string
name: extract_symbolic_data
arguments: data_label: D80
type: string
name: extract_symbolic_data
arguments: data_label: D344
type: string
name: extract_symbolic_data
arguments: data_label: D237
type: string
name: extract_symbolic_data
arguments: data_label: D346
type: string
name: extract_symbolic_data
arguments: data_label: D126
type: string
name: extract_symbolic_data
arguments: data_label: D248
type: string
name: extract_symbolic_data
arguments: data_label: D120
type: string
name: extract_symbolic_data
arguments: data_label: D4
type: string
name: extract_symbolic_data
arguments: data_label: D156
type: string
name: extract_symbolic_data
arguments: data_label: D189
type: string
name: extract_symbolic_data
arguments: data_label: D98
type: string
name: extract_symbolic_data
arguments: data_label: D400
type: string
name: extract_symbolic_data
arguments: data_label: D232
type: string
name: extract_symbolic_data
arguments: data_label: D218
type: string
name: extract_symbolic_data
arguments: data_label: D311
type: string
name: extract_symbolic_data
arguments: data_label: D67
type: string
name: extract_symbolic_data
arguments: data_label: D245
type: string
name: extract_symbolic_data
arguments: data_label: D368
type: string
name: extract_symbolic_data
arguments: data_label: D73
type: string
name: extract_symbolic_data
arguments: data_label: D81
type: string
name: extract_symbolic_data
arguments: data_label: D32
type: string
name: extract_symbolic_data
arguments: data_label: D272
type: string
name: extract_symbolic_data
arguments: data_label: D214
type: string
name: extract_symbolic_data
arguments: data_label: D76
type: string
name: extract_symbolic_data
arguments: data_label: D166
type: string
name: extract_symbolic_data
arguments: data_label: D215
type: string
name: extract_symbolic_data
arguments: data_label: D150
type: string
name: extract_symbolic_data
arguments: data_label: D345
type: string
name: extract_symbolic_data
arguments: data_label: D147
type: string
name: extract_symbolic_data
arguments: data_label: D253
type: string
name: extract_symbolic_data
arguments: data_label: D97
type: string
name: extract_symbolic_data
arguments: data_label: D282
type: string
name: extract_symbolic_data
arguments: data_label: D361
type: string
name: extract_symbolic_data
arguments: data_label: D167
type: string
name: extract_symbolic_data
arguments: data_label: D58
type: string

tool: D57: k4

tool: D134: k5

tool: D80: k6

tool: D344: k2

tool: D237: KeyVal_setValue

tool: D346: k3

tool: D126: KeyVal_new

tool: D248: 2

tool: D120: k1

tool: D4: asdf${k1}zxcv

tool: D156: ${k1}zxcv

tool: D189: asdf${k1}

tool: D98: a${k1}b${k1}${k1}c

tool: D400: ${k${k1}}

tool: D232: }${

tool: D218: k7

tool: D311: ${}

tool: D67: k8

tool: D245: ${k10}

tool: D368: k9

tool: D73: ${k9}

tool: D81: k10

tool: D32: KeyVal_getValue

tool: D272: asdf2zxcv

tool: D214: 8a. variable in middle of string

tool: D76: 2zxcv

tool: D166: 8b. variable at beginning of string

tool: D215: asdf2

tool: D150: 8c. variable at end of string

tool: D345: a2b22c

tool: D147: 8d. multiple variables in the string

tool: D253: 8e. embedded variables

tool: D97: 8f. weird initial closing brace

tool: D282: 8g. empty variable name

tool: D361: 8h. recursive variables detected

tool: D167: KeyVal_delete

tool: D58:  - got '%s' instead of 'asdf2zxcv'


assistant: ```c
void test8() {
  struct KeyVal *kv;
  _check_err(KeyVal_new(&kv), "KeyVal_new");
  _check_err(KeyVal_setValue(kv, "k1", "2"), "KeyVal_setValue");
  _check_err(KeyVal_setValue(kv, "k2", "asdf${k1}zxcv"), "KeyVal_setValue");
  _check_err(KeyVal_setValue(kv, "k3", "${k1}zxcv"), "KeyVal_setValue");
  _check_err(KeyVal_setValue(kv, "k4", "asdf${k1}"), "KeyVal_setValue");
  _check_err(KeyVal_setValue(kv, "k5", "a${k1}b${k1}${k1}c"), "KeyVal_setValue");
  _check_err(KeyVal_setValue(kv, "k6", "${k${k1}}"), "KeyVal_setValue");
  _check_err(KeyVal_setValue(kv, "k7", "}${"), "KeyVal_setValue");
  _check_err(KeyVal_setValue(kv, "k8", "${}"), "KeyVal_setValue");
  _check_err(KeyVal_setValue(kv, "k9", "${k10}"), "KeyVal_setValue");
  _check_err(KeyVal_setValue(kv, "k10", "${k9}"), "KeyVal_setValue");
  char *value;
  _check_err(KeyVal_getValue(&value, kv, "k2", 1), "KeyVal_getValue");
  if (!ok(strcmp(value, "asdf2zxcv") == 0, "8a. variable in middle of string")) {
    printf(" - got '%s' instead of 'asdf2zxcv'\n", value);
  }
  free(value);
  _check_err(KeyVal_getValue(&value, kv, "k3", 1), "KeyVal_getValue");
  ok(strcmp(value, "2zxcv") == 0, "8b. variable at beginning of string");
  free(value);
  _check_err(KeyVal_getValue(&value, kv, "k4", 1), "KeyVal_getValue");
  ok(strcmp(value, "asdf2") == 0, "8c. variable at end of string");
  free(value);
  _check_err(KeyVal_getValue(&value, kv, "k5", 1), "KeyVal_getValue");
  ok(strcmp(value, "a2b22c") == 0, "8d. multiple variables in the string");
  free(value);
  _check_err(KeyVal_getValue(&value, kv, "k6", 1), "KeyVal_getValue");
  ok(strcmp(value, "asdf2zxcv") == 0, "8e. embedded variables");
  free(value);
  _check_err(KeyVal_getValue(&value, kv, "k7", 1), "KeyVal_getValue");
  ok(strcmp(value, "}${") == 0, "8f. weird initial closing brace");
  free(value);
  _check_err(KeyVal_getValue(&value, kv, "k8", 1), "KeyVal_getValue");
  ok(strcmp(value, "${}") == 0, "8g. empty variable name");
  free(value);
  unsigned char getvalue_res = KeyVal_getValue(&value, kv, "k9", 1);
  ok(getvalue_res == 2, "8h. recursive variables detected");
  _check_err(KeyVal_delete(kv), "KeyVal_delete");
}
```