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

```asm
<power>:
  endbr64
  mov    $0x1,%r8d
  test   %esi,%esi
  je     L359
  cmp    $0x2,%esi
  je     L390
L78:
  test   $0x1,%sil
  je     L478
  imul   %rdi,%r8
  sub    $0x1,%esi
  je     L359
  cmp    $0x2,%esi
  jne    L78
L390:
  imul   %rdi,%rdi
  imul   %rdi,%r8
  mov    %r8,%rax
  ret
  nopl   0x0(%rax,%rax,1)
L478:
  mov    %esi,%ecx
  shr    $0x1f,%ecx
  add    %esi,%ecx
  sar    %ecx
  je     L359
  mov    $0x1,%edx
L14:
  cmp    $0x2,%ecx
  je     L372
  test   $0x1,%cl
  je     L303
  imul   %rdi,%rdx
  sub    $0x1,%ecx
  jne    L14
L426:
  imul   %rdx,%rdx
  imul   %rdx,%r8
L359:
  mov    %r8,%rax
  ret
  nopl   0x0(%rax,%rax,1)
L303:
  mov    %ecx,%eax
  shr    $0x1f,%eax
  add    %ecx,%eax
  sar    %eax
  je     L426
  push   %r15
  mov    $0x1,%r15d
  push   %r14
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  sub    $0x28,%rsp
L183:
  cmp    $0x2,%eax
  je     L458
  test   $0x1,%al
  je     L211
  imul   %rdi,%r15
  sub    $0x1,%eax
  jne    L183
L311:
  imul   %r15,%r15
  add    $0x28,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  imul   %r15,%rdx
  pop    %r14
  pop    %r15
  imul   %rdx,%rdx
  imul   %rdx,%r8
  mov    %r8,%rax
  ret
  nopw   0x0(%rax,%rax,1)
L211:
  mov    %eax,%ecx
  shr    $0x1f,%ecx
  add    %eax,%ecx
  sar    %ecx
  je     L311
  mov    $0x1,%r14d
L494:
  cmp    $0x2,%ecx
  je     L108
  test   $0x1,%cl
  je     L318
  imul   %rdi,%r14
  sub    $0x1,%ecx
  jne    L494
L495:
  imul   %r14,%r14
  imul   %r14,%r15
  jmp    L311
  nopw   0x0(%rax,%rax,1)
L318:
  mov    %ecx,%eax
  shr    $0x1f,%eax
  add    %ecx,%eax
  sar    %eax
  je     L495
  mov    $0x1,%r13d
L258:
  cmp    $0x2,%eax
  je     L35
  test   $0x1,%al
  je     L370
  imul   %rdi,%r13
  sub    $0x1,%eax
  jne    L258
L105:
  imul   %r13,%r13
  imul   %r13,%r14
  nopw   0x0(%rax,%rax,1)
L16:
  imul   %r14,%r14
  imul   %r14,%r15
  jmp    L311
  nopl   (%rax)
L370:
  mov    %eax,%ecx
  shr    $0x1f,%ecx
  add    %eax,%ecx
  sar    %ecx
  je     L105
  mov    $0x1,%r12d
L497:
  cmp    $0x2,%ecx
  je     L302
  test   $0x1,%cl
  je     L230
  imul   %rdi,%r12
  sub    $0x1,%ecx
  jne    L497
L437:
  imul   %r12,%r12
  imul   %r12,%r13
L162:
  imul   %r13,%r13
  imul   %r13,%r14
  jmp    L16
  nopw   0x0(%rax,%rax,1)
L230:
  mov    %ecx,%eax
  shr    $0x1f,%eax
  add    %ecx,%eax
  sar    %eax
  je     L437
  mov    $0x1,%ebp
L485:
  cmp    $0x2,%eax
  je     L107
  test   $0x1,%al
  je     L2
  imul   %rdi,%rbp
  sub    $0x1,%eax
  jne    L485
L54:
  imul   %rbp,%rbp
  imul   %rbp,%r12
  xchg   %ax,%ax
L6:
  imul   %r12,%r12
  imul   %r12,%r13
  jmp    L162
  nopw   0x0(%rax,%rax,1)
L2:
  mov    %eax,%ecx
  shr    $0x1f,%ecx
  add    %eax,%ecx
  sar    %ecx
  je     L54
  mov    $0x1,%ebx
L50:
  cmp    $0x2,%ecx
  je     L493
  test   $0x1,%cl
  je     L301
  imul   %rdi,%rbx
  sub    $0x1,%ecx
  jne    L50
L398:
  imul   %rbx,%rbx
  imul   %rbx,%rbp
  nop
L196:
  imul   %rbp,%rbp
  imul   %rbp,%r12
  jmp    L6
  nopw   0x0(%rax,%rax,1)
L301:
  mov    %ecx,%eax
  shr    $0x1f,%eax
  add    %ecx,%eax
  sar    %eax
  je     L398
  mov    $0x1,%ecx
L357:
  cmp    $0x2,%eax
  je     L355
  test   $0x1,%al
  je     L181
  imul   %rdi,%rcx
  sub    $0x1,%eax
  jne    L357
  imul   %rcx,%rcx
  imul   %rcx,%rbx
  imul   %rbx,%rbx
  imul   %rbx,%rbp
  jmp    L196
  nopl   0x0(%rax)
L181:
  mov    %eax,%esi
  mov    %r8,0x18(%rsp)
  shr    $0x1f,%esi
  mov    %rdx,0x10(%rsp)
  add    %eax,%esi
  mov    %rcx,0x8(%rsp)
  sar    %esi
  call   <power>
  mov    0x8(%rsp),%rcx
  mov    0x10(%rsp),%rdx
  mov    0x18(%rsp),%r8
  mov    %rax,%rdi
L355:
  imul   %rdi,%rdi
  imul   %rcx,%rdi
L493:
  imul   %rdi,%rdi
  imul   %rdi,%rbx
  imul   %rbx,%rbx
  imul   %rbx,%rbp
  jmp    L196
  nopl   0x0(%rax)
L107:
  imul   %rdi,%rdi
  imul   %rdi,%rbp
  jmp    L54
  nopl   (%rax)
L302:
  imul   %rdi,%rdi
  imul   %rdi,%r12
  jmp    L437
  nopl   (%rax)
L35:
  imul   %rdi,%rdi
  imul   %rdi,%r13
  jmp    L105
  nopl   (%rax)
L108:
  imul   %rdi,%rdi
  imul   %rdi,%r14
  jmp    L495
  nopl   (%rax)
L458:
  imul   %rdi,%rdi
  imul   %rdi,%r15
  jmp    L311
  nopl   (%rax)
L372:
  imul   %rdi,%rdi
  imul   %rdi,%rdx
  jmp    L426
```

assistant: ```c
long int power(long int x, int n) {
  if (n == 0) {
    return 1;
  } else if (n == 2) {
    return x * x;
  } else if (n % 2 == 0) {
    return power(power(x, n / 2), 2);
  } else {
    return x * power(x, n - 1);
  }
}
```