user: 请从给定的汇编指令推导出C源代码:

```asm
<main>:
  endbr64
  push   %r13
  xor    %eax,%eax
  push   %r12
  push   %rbp
  mov    $0xfffffc7c,%ebp
  call   <get_tz_min@plt>
  mov    %eax,%r13d
  xor    %eax,%eax
  call   <get_tz_dst@plt>
  mov    %r13d,%esi
  lea    D78(%rip),%rdi
  mov    %eax,%edx
  mov    %eax,%r12d
  xor    %eax,%eax
  call   <printf@plt>
  lea    D3(%rip),%rdi
  xor    %eax,%eax
  call   <printf@plt>
  jmp    L85
  nopl   (%rax)
L25:
  add    $0x1e,%ebp
  cmp    $0x384,%ebp
  je     L2
L85:
  mov    %r12d,%esi
  mov    %ebp,%edi
  call   <set_tz@plt>
  xor    %eax,%eax
  call   <get_tz_min@plt>
  cmp    %ebp,%eax
  je     L25
  mov    %eax,%edx
  mov    %ebp,%esi
  lea    D29(%rip),%rdi
  xor    %eax,%eax
  call   <printf@plt>
L96:
  mov    %r12d,%esi
  mov    %r13d,%edi
  call   <set_tz@plt>
  pop    %rbp
  xor    %eax,%eax
  pop    %r12
  pop    %r13
  jmp    10e0 <ksft_exit_fail@plt>
L2:
  lea    D10(%rip),%rbp
  mov    %rbp,%rdi
  call   <puts@plt>
  lea    D23(%rip),%rdi
  xor    %eax,%eax
  call   <printf@plt>
  mov    %r12d,%esi
  mov    $0xfffffc7b,%edi
  call   <set_tz@plt>
  test   %eax,%eax
  je     L70
  mov    %r12d,%esi
  mov    $0x385,%edi
  call   <set_tz@plt>
  test   %eax,%eax
  je     L21
  mov    %r12d,%esi
  mov    $0xfffffa60,%edi
  call   <set_tz@plt>
  test   %eax,%eax
  je     L11
  mov    %r12d,%esi
  mov    $0x5a0,%edi
  call   <set_tz@plt>
  test   %eax,%eax
  je     L67
  mov    %rbp,%rdi
  call   <puts@plt>
  mov    %r12d,%esi
  mov    %r13d,%edi
  call   <set_tz@plt>
  pop    %rbp
  xor    %eax,%eax
  pop    %r12
  pop    %r13
  jmp    10d0 <ksft_exit_pass@plt>
L70:
  mov    $0xfffffc7b,%esi
  lea    D48(%rip),%rdi
  call   <printf@plt>
  jmp    L96
L21:
  mov    $0x385,%esi
  lea    D48(%rip),%rdi
  call   <printf@plt>
  jmp    L96
L67:
  mov    $0x5a0,%esi
  lea    D48(%rip),%rdi
  call   <printf@plt>
  jmp    L96
L11:
  mov    $0xfffffa60,%esi
  lea    D48(%rip),%rdi
  call   <printf@plt>
  jmp    L96
```

tool_calls: name: unpack_data
arguments: data_tag: D78
data_type: string
name: unpack_data
arguments: data_tag: D3
data_type: string
name: unpack_data
arguments: data_tag: D29
data_type: string
name: unpack_data
arguments: data_tag: D10
data_type: string
name: unpack_data
arguments: data_tag: D23
data_type: string
name: unpack_data
arguments: data_tag: D48
data_type: string

tool: D78: tz_minuteswest started at %i, dst at %i


tool: D3: Checking tz_minuteswest can be properly set: 

tool: D29: [FAILED] expected: %i got %i


tool: D10: [OK]

tool: D23: Checking invalid tz_minuteswest values are caught: 

tool: D48: [FAILED] %i didn't return failure!


assistant: ```c
int main(int argc, char **argv) {
  int i, ret;
  int min, dst;
  min = get_tz_min();
  dst = get_tz_dst();
  printf("tz_minuteswest started at %i, dst at %i\n", min, dst);
  printf("Checking tz_minuteswest can be properly set: ");
  for (i = -15 * 60; i < 15 * 60; i += 30) {
    ret = set_tz(i, dst);
    ret = get_tz_min();
    if (ret != i) {
      printf("[FAILED] expected: %i got %i\n", i, ret);
      goto err;
    }
  }
  printf("[OK]\n");
  printf("Checking invalid tz_minuteswest values are caught: ");
  if (!set_tz(-15 * 60 - 1, dst)) {
    printf("[FAILED] %i didn't return failure!\n", -15 * 60 - 1);
    goto err;
  }
  if (!set_tz(15 * 60 + 1, dst)) {
    printf("[FAILED] %i didn't return failure!\n", 15 * 60 + 1);
    goto err;
  }
  if (!set_tz(-24 * 60, dst)) {
    printf("[FAILED] %i didn't return failure!\n", -24 * 60);
    goto err;
  }
  if (!set_tz(24 * 60, dst)) {
    printf("[FAILED] %i didn't return failure!\n", 24 * 60);
    goto err;
  }
  printf("[OK]\n");
  set_tz(min, dst);
  return ksft_exit_pass();
err:
  set_tz(min, dst);
  return ksft_exit_fail();
}
```