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

```asm
<main>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x20,%rsp
  mov    %fs:0x28,%rax
  mov    %rax,-0x8(%rbp)
  xor    %eax,%eax
  jmp    L55
L79:
  movw   $0x0,-0xc(%rbp)
  movzwl -0x10(%rbp),%eax
  mov    %ax,-0xa(%rbp)
  jmp    L17
L16:
  movzwl -0xa(%rbp),%ecx
  movzwl %cx,%eax
  imul   $0xcccd,%eax,%eax
  shr    $0x10,%eax
  mov    %eax,%edx
  shr    $0x3,%dx
  mov    %edx,%eax
  shl    $0x2,%eax
  add    %edx,%eax
  add    %eax,%eax
  sub    %eax,%ecx
  mov    %ecx,%edx
  mov    %dl,-0x14(%rbp)
  movzwl -0xa(%rbp),%eax
  movzwl %ax,%eax
  imul   $0xcccd,%eax,%eax
  shr    $0x10,%eax
  mov    %eax,%ecx
  shr    $0x3,%cx
  movzwl %cx,%eax
  imul   $0xcccd,%eax,%eax
  shr    $0x10,%eax
  mov    %eax,%edx
  shr    $0x3,%dx
  mov    %edx,%eax
  shl    $0x2,%eax
  add    %edx,%eax
  add    %eax,%eax
  sub    %eax,%ecx
  mov    %ecx,%edx
  mov    %dl,-0x13(%rbp)
  movzwl -0xa(%rbp),%eax
  shr    $0x2,%ax
  movzwl %ax,%eax
  imul   $0x147b,%eax,%eax
  shr    $0x10,%eax
  mov    %eax,%ecx
  shr    %cx
  movzwl %cx,%eax
  imul   $0xcccd,%eax,%eax
  shr    $0x10,%eax
  mov    %eax,%edx
  shr    $0x3,%dx
  mov    %edx,%eax
  shl    $0x2,%eax
  add    %edx,%eax
  add    %eax,%eax
  sub    %eax,%ecx
  mov    %ecx,%edx
  mov    %dl,-0x12(%rbp)
  movzwl -0xa(%rbp),%eax
  shr    $0x3,%ax
  movzwl %ax,%eax
  imul   $0x20c5,%eax,%eax
  shr    $0x10,%eax
  shr    $0x4,%ax
  mov    %al,-0x11(%rbp)
  movzbl -0x14(%rbp),%eax
  cmp    -0x13(%rbp),%al
  je     L9
  movzbl -0x14(%rbp),%eax
  cmp    -0x12(%rbp),%al
  je     L9
  movzbl -0x14(%rbp),%eax
  cmp    -0x11(%rbp),%al
  je     L9
  movzbl -0x13(%rbp),%eax
  cmp    -0x12(%rbp),%al
  je     L9
  movzbl -0x13(%rbp),%eax
  cmp    -0x11(%rbp),%al
  je     L9
  movzbl -0x12(%rbp),%eax
  cmp    -0x11(%rbp),%al
  je     L9
  movzwl -0xc(%rbp),%eax
  add    $0x1,%eax
  mov    %ax,-0xc(%rbp)
L9:
  movzwl -0xa(%rbp),%eax
  add    $0x1,%eax
  mov    %ax,-0xa(%rbp)
L17:
  movzwl -0xe(%rbp),%eax
  cmp    %ax,-0xa(%rbp)
  jbe    L16
  movzwl -0xe(%rbp),%eax
  movzwl %ax,%ecx
  movzwl -0x10(%rbp),%eax
  movzwl %ax,%edx
  movzwl -0xc(%rbp),%eax
  mov    %eax,%esi
  lea    D17(%rip),%rax
  mov    %rax,%rdi
  call   <printf@plt>
L55:
  lea    -0xe(%rbp),%rdx
  lea    -0x10(%rbp),%rax
  mov    %rax,%rsi
  lea    D15(%rip),%rax
  mov    %rax,%rdi
  call   <scanf@plt>
  cmp    $0x2,%eax
  je     L79
  mov    $0x0,%eax
  mov    -0x8(%rbp),%rdx
  sub    %fs:0x28,%rdx
  je     L77
  call   <__stack_chk_fail@plt>
L77:
  leave
  ret
```

tool_calls: name: disassemble_data
arguments: data_label: D17
datatype: string
name: disassemble_data
arguments: data_label: D15
datatype: string

tool: D17: There are %hu non-repeating years between %hu and %hu.


tool: D15: %hu %hu

assistant: ```c
int main(void) {
  unsigned short begin, end;
  while (scanf("%hu %hu", &begin, &end) == 2) {
    unsigned short counter = 0;
    for (unsigned short i = begin; i <= end; i++) {
      char a = i % 10;
      char b = (i / 10) % 10;
      char c = (i / 100) % 10;
      char d = i / 1000;
      if (!(a == b || a == c || a == d || b == c || b == d || c == d))
        counter++;
    }
    printf("There are %hu non-repeating years between %hu and %hu.\n", counter, begin, end);
  }
}
```