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

```asm
<sub_time>:
  endbr64
  push   %r15
  push   %r14
  push   %r13
  push   %r12
  mov    %ecx,%r12d
  push   %rbp
  mov    %r8d,%ebp
  push   %rbx
  mov    %r9d,%ebx
  sub    $0x18,%rsp
  mov    0x60(%rsp),%r14d
  mov    0x58(%rsp),%r13d
  mov    0x50(%rsp),%r10d
  cmp    %edx,%r14d
  sete   %cl
  cmp    %r12d,0x68(%rsp)
  sete   %al
  cmp    %r8d,0x70(%rsp)
  sete   %r11b
  cmp    %esi,%r13d
  jne    L270
  test   %cl,%cl
  je     L278
  test   %r11b,%r11b
  je     L270
  test   %al,%al
  je     L270
  cmp    %r9d,0x78(%rsp)
  je     L141
  mov    0x78(%rsp),%eax
  mov    %r12d,%ecx
  push   %rax
  mov    0x78(%rsp),%eax
  push   %rax
  mov    0x78(%rsp),%eax
  push   %rax
  push   %r14
  push   %r13
  push   %r10
  mov    %r10d,0x80(%rsp)
  mov    %edx,0x38(%rsp)
  mov    %esi,0x34(%rsp)
  mov    %edi,0x30(%rsp)
  call   <cmp_time@plt>
  add    $0x30,%rsp
  mov    (%rsp),%edi
  mov    0x4(%rsp),%esi
  test   %eax,%eax
  mov    %eax,%r15d
  mov    0x8(%rsp),%edx
  mov    0x50(%rsp),%r10d
  jns    L101
  mov    %ebx,%eax
  mov    0x78(%rsp),%ebx
  mov    %eax,0x78(%rsp)
  mov    %ebp,%eax
  mov    0x70(%rsp),%ebp
  mov    %eax,0x70(%rsp)
  mov    %edx,%eax
  mov    %r14d,%edx
  mov    %eax,%r14d
  mov    %esi,%eax
  mov    %r13d,%esi
  mov    %eax,%r13d
  mov    %edi,%eax
  mov    %r10d,%edi
  mov    %eax,%r10d
  jmp    L101
  nop
L278:
  and    %r11d,%eax
  mov    %al,0xf(%rsp)
L272:
  mov    0x78(%rsp),%eax
  mov    %r11b,0xe(%rsp)
  mov    %ebx,%r9d
  mov    %ebp,%r8d
  mov    %r12d,%ecx
  push   %rax
  mov    0x78(%rsp),%eax
  push   %rax
  mov    0x78(%rsp),%eax
  push   %rax
  push   %r14
  push   %r13
  push   %r10
  mov    %r10d,0x80(%rsp)
  mov    %edx,0x38(%rsp)
  mov    %esi,0x34(%rsp)
  mov    %edi,0x30(%rsp)
  call   <cmp_time@plt>
  add    $0x30,%rsp
  mov    (%rsp),%edi
  mov    0x4(%rsp),%esi
  test   %eax,%eax
  mov    %eax,%r15d
  mov    0x8(%rsp),%edx
  mov    0x50(%rsp),%r10d
  movzbl 0xe(%rsp),%r11d
  jns    L127
  mov    %ebx,%eax
  mov    0x78(%rsp),%ebx
  mov    %eax,0x78(%rsp)
  mov    %ebp,%eax
  mov    0x70(%rsp),%ebp
  mov    %eax,0x70(%rsp)
  mov    %r12d,%eax
  mov    0x68(%rsp),%r12d
  mov    %eax,0x68(%rsp)
  mov    %edx,%eax
  mov    %r14d,%edx
  mov    %eax,%r14d
  mov    %esi,%eax
  mov    %r13d,%esi
  mov    %eax,%r13d
  mov    %edi,%eax
  mov    %r10d,%edi
  mov    %eax,%r10d
L127:
  cmpb   $0x0,0xf(%rsp)
  je     L191
  cmp    0x78(%rsp),%ebx
  je     L160
L101:
  mov    %r14d,%r9d
  mov    %r13d,%r8d
  mov    %r10d,%ecx
  mov    $0x18,%r12d
  call   <sub_day@plt>
  sub    $0x1,%eax
L134:
  lea    (%rax,%rax,2),%eax
  sub    0x70(%rsp),%ebp
  sub    0x78(%rsp),%ebx
  imul   $0x3c,%ebp,%ebp
  lea    (%r12,%rax,8),%eax
  imul   $0xe10,%eax,%eax
  add    %ebp,%eax
  add    %eax,%ebx
  mov    0x80(%rsp),%rax
  imul   %r15d,%ebx
  mov    %ebx,(%rax)
  mov    0x88(%rsp),%rax
  movl   $0xd,(%rax)
L227:
  add    $0x18,%rsp
  xor    %eax,%eax
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
  nopl   0x0(%rax)
L270:
  test   %cl,%cl
  je     L278
  test   %al,%al
  je     L278
  cmp    %ebx,0x78(%rsp)
  jne    L62
  test   %r11b,%r11b
  je     L62
  sub    %r10d,%edi
  mov    0x80(%rsp),%rbx
  lea    (%rdi,%rdi,2),%eax
  lea    (%rsi,%rax,4),%eax
  sub    %r13d,%eax
  mov    %eax,(%rbx)
  mov    0x88(%rsp),%rax
  movl   $0x3,(%rax)
  jmp    L227
  nopl   0x0(%rax)
L191:
  mov    %r14d,%r9d
  mov    %r13d,%r8d
  mov    %r10d,%ecx
  mov    %r11b,(%rsp)
  call   <sub_day@plt>
  add    $0x18,%r12d
  sub    0x68(%rsp),%r12d
  sub    $0x1,%eax
  cmp    0x78(%rsp),%ebx
  jne    L254
  movzbl (%rsp),%r11d
  test   %r11b,%r11b
  je     L254
  imul   $0xaaaaaaab,%r12d,%edx
  lea    0x2aaaaaa8(%rdx),%ecx
  ror    $0x2,%ecx
  cmp    $0x15555554,%ecx
  jbe    L264
  add    $0x2aaaaaaa,%edx
  mov    %edx,%ecx
  ror    %ecx
  cmp    $0x2aaaaaaa,%ecx
  jbe    L171
  cmp    $0x55555554,%edx
  ja     L112
  movslq %r12d,%rdx
  sar    $0x1f,%r12d
  mov    0x80(%rsp),%rbx
  imul   $0x55555556,%rdx,%rdx
  shr    $0x20,%rdx
  sub    %r12d,%edx
  lea    (%rdx,%rax,8),%eax
  imul   %r15d,%eax
  mov    %eax,(%rbx)
  mov    0x88(%rsp),%rax
  movl   $0xa,(%rax)
  jmp    L227
  nopl   0x0(%rax)
L62:
  mov    %r11b,0xf(%rsp)
  jmp    L272
  nopw   0x0(%rax,%rax,1)
L171:
  movslq %r12d,%rdx
  sar    $0x1f,%r12d
  mov    0x80(%rsp),%rbx
  imul   $0x2aaaaaab,%rdx,%rdx
  shr    $0x20,%rdx
  sub    %r12d,%edx
  lea    (%rdx,%rax,4),%eax
  imul   %r15d,%eax
  mov    %eax,(%rbx)
  mov    0x88(%rsp),%rax
  movl   $0xb,(%rax)
  jmp    L227
  nopl   0x0(%rax)
L141:
  mov    0x80(%rsp),%rax
  sub    %r10d,%edi
  mov    %edi,(%rax)
  mov    0x88(%rsp),%rax
  movl   $0x4,(%rax)
  jmp    L227
  nopl   0x0(%rax,%rax,1)
L264:
  movslq %r12d,%rdx
  sar    $0x1f,%r12d
  mov    0x80(%rsp),%rbx
  imul   $0x2aaaaaab,%rdx,%rdx
  sar    $0x21,%rdx
  sub    %r12d,%edx
  lea    (%rdx,%rax,2),%eax
  imul   %r15d,%eax
  mov    %eax,(%rbx)
  mov    0x88(%rsp),%rax
  movl   $0xc,(%rax)
  jmp    L227
  nopl   0x0(%rax)
L112:
  lea    (%rax,%rax,2),%eax
  mov    0x80(%rsp),%rbx
  lea    (%r12,%rax,8),%eax
  imul   %r15d,%eax
  mov    %eax,(%rbx)
  jmp    L227
  nopw   0x0(%rax,%rax,1)
L254:
  lea    (%rax,%rax,2),%edx
  mov    %ebp,%ecx
  sub    0x70(%rsp),%ecx
  lea    (%r12,%rdx,8),%edx
  cmp    0x78(%rsp),%ebx
  jne    L134
  imul   $0x3c,%edx,%eax
  mov    0x80(%rsp),%rbx
  add    %ecx,%eax
  imul   %r15d,%eax
  mov    %eax,(%rbx)
  mov    0x88(%rsp),%rax
  movl   $0x0,(%rax)
  jmp    L227
  nopl   (%rax)
L160:
  mov    %r14d,%r9d
  mov    %r13d,%r8d
  mov    %r10d,%ecx
  call   <sub_day@plt>
  mov    0x80(%rsp),%rbx
  imul   %r15d,%eax
  mov    %eax,(%rbx)
  mov    0x88(%rsp),%rax
  movl   $0x2,(%rax)
  jmp    L227
```

assistant: ```c
int sub_time(int year1, int month1, int day1, int hour1, int minute1, int second1, int year0, int month0, int day0, int hour0, int minute0, int second0, int *dtime, int *unit) {
  int sign, i, dt;
  if (month0 == month1 && day0 == day1 && hour0 == hour1 && minute0 == minute1 && second0 == second1) {
    *dtime = year1 - year0;
    *unit = 4;
    return 0;
  }
  if (day0 == day1 && hour0 == hour1 && minute0 == minute1 && second0 == second1) {
    *dtime = (year1 - year0) * 12 + month1 - month0;
    *unit = 3;
    return 0;
  }
  sign = cmp_time(year1, month1, day1, hour1, minute1, second1, year0, month0, day0, hour0, minute0, second0);
  if (sign < 0) {
    i = year0;
    year0 = year1;
    year1 = i;
    i = month0;
    month0 = month1;
    month1 = i;
    i = day0;
    day0 = day1;
    day1 = i;
    i = hour0;
    hour0 = hour1;
    hour1 = i;
    i = minute0;
    minute0 = minute1;
    minute1 = i;
    i = second0;
    second0 = second1;
    second1 = i;
  }
  if (hour0 == hour1 && minute0 == minute1 && second0 == second1) {
    *dtime = sign * sub_day(year1, month1, day1, year0, month0, day0);
    *unit = 2;
    return 0;
  }
  dt = sub_day(year1, month1, day1, year0, month0, day0) - 1;
  i = 24 + hour1 - hour0;
  if (minute0 == minute1 && second0 == second1) {
    if (i % 12 == 0) {
      dt = dt * 2 + i / 12;
      *dtime = sign * dt;
      *unit = 12;
      return 0;
    }
    if (i % 6 == 0) {
      dt = dt * 4 + i / 6;
      *dtime = sign * dt;
      *unit = 11;
      return 0;
    }
    if (i % 3 == 0) {
      dt = dt * 8 + i / 3;
      *dtime = sign * dt;
      *unit = 10;
      return 0;
    }
    dt = dt * 24 + i;
    *dtime = sign * dt;
    return 0;
  }
  if (second0 == second1) {
    dt = (dt * 24 + i) * 60 + (minute1 - minute0);
    *dtime = sign * dt;
    *unit = 0;
    return 0;
  }
  dt = (dt * 24 + i) * 60 * 60 + (minute1 - minute0) * 60 + (second1 - second0);
  *dtime = sign * dt;
  *unit = 13;
  return 0;
}
```