user: 请显示与下面列出的汇编代码相匹配的C语言实现:

```asm
<power>:
  endbr64
  mov    $0x1,%r8d
  test   %esi,%esi
  je     L170
  cmp    $0x2,%esi
  je     L263
L24:
  test   $0x1,%sil
  je     L229
  imul   %rdi,%r8
  sub    $0x1,%esi
  je     L170
  cmp    $0x2,%esi
  jne    L24
L263:
  imul   %rdi,%rdi
  imul   %rdi,%r8
  mov    %r8,%rax
  ret
  nopl   0x0(%rax,%rax,1)
L229:
  mov    %esi,%ecx
  shr    $0x1f,%ecx
  add    %esi,%ecx
  sar    %ecx
  je     L170
  mov    $0x1,%edx
L178:
  cmp    $0x2,%ecx
  je     L499
  test   $0x1,%cl
  je     L323
  imul   %rdi,%rdx
  sub    $0x1,%ecx
  jne    L178
L173:
  imul   %rdx,%rdx
  imul   %rdx,%r8
L170:
  mov    %r8,%rax
  ret
  nopl   0x0(%rax,%rax,1)
L323:
  mov    %ecx,%eax
  shr    $0x1f,%eax
  add    %ecx,%eax
  sar    %eax
  je     L173
  push   %r15
  mov    $0x1,%r15d
  push   %r14
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  sub    $0x28,%rsp
L277:
  cmp    $0x2,%eax
  je     L36
  test   $0x1,%al
  je     L56
  imul   %rdi,%r15
  sub    $0x1,%eax
  jne    L277
L493:
  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)
L56:
  mov    %eax,%ecx
  shr    $0x1f,%ecx
  add    %eax,%ecx
  sar    %ecx
  je     L493
  mov    $0x1,%r14d
L47:
  cmp    $0x2,%ecx
  je     L460
  test   $0x1,%cl
  je     L60
  imul   %rdi,%r14
  sub    $0x1,%ecx
  jne    L47
L422:
  imul   %r14,%r14
  imul   %r14,%r15
  jmp    L493
  nopw   0x0(%rax,%rax,1)
L60:
  mov    %ecx,%eax
  shr    $0x1f,%eax
  add    %ecx,%eax
  sar    %eax
  je     L422
  mov    $0x1,%r13d
L286:
  cmp    $0x2,%eax
  je     L497
  test   $0x1,%al
  je     L148
  imul   %rdi,%r13
  sub    $0x1,%eax
  jne    L286
L408:
  imul   %r13,%r13
  imul   %r13,%r14
  nopw   0x0(%rax,%rax,1)
L62:
  imul   %r14,%r14
  imul   %r14,%r15
  jmp    L493
  nopl   (%rax)
L148:
  mov    %eax,%ecx
  shr    $0x1f,%ecx
  add    %eax,%ecx
  sar    %ecx
  je     L408
  mov    $0x1,%r12d
L14:
  cmp    $0x2,%ecx
  je     L322
  test   $0x1,%cl
  je     L404
  imul   %rdi,%r12
  sub    $0x1,%ecx
  jne    L14
L131:
  imul   %r12,%r12
  imul   %r12,%r13
L200:
  imul   %r13,%r13
  imul   %r13,%r14
  jmp    L62
  nopw   0x0(%rax,%rax,1)
L404:
  mov    %ecx,%eax
  shr    $0x1f,%eax
  add    %ecx,%eax
  sar    %eax
  je     L131
  mov    $0x1,%ebp
L179:
  cmp    $0x2,%eax
  je     L470
  test   $0x1,%al
  je     L100
  imul   %rdi,%rbp
  sub    $0x1,%eax
  jne    L179
L58:
  imul   %rbp,%rbp
  imul   %rbp,%r12
  xchg   %ax,%ax
L21:
  imul   %r12,%r12
  imul   %r12,%r13
  jmp    L200
  nopw   0x0(%rax,%rax,1)
L100:
  mov    %eax,%ecx
  shr    $0x1f,%ecx
  add    %eax,%ecx
  sar    %ecx
  je     L58
  mov    $0x1,%ebx
L453:
  cmp    $0x2,%ecx
  je     L120
  test   $0x1,%cl
  je     L340
  imul   %rdi,%rbx
  sub    $0x1,%ecx
  jne    L453
L220:
  imul   %rbx,%rbx
  imul   %rbx,%rbp
  nop
L366:
  imul   %rbp,%rbp
  imul   %rbp,%r12
  jmp    L21
  nopw   0x0(%rax,%rax,1)
L340:
  mov    %ecx,%eax
  shr    $0x1f,%eax
  add    %ecx,%eax
  sar    %eax
  je     L220
  mov    $0x1,%ecx
L66:
  cmp    $0x2,%eax
  je     L337
  test   $0x1,%al
  je     L39
  imul   %rdi,%rcx
  sub    $0x1,%eax
  jne    L66
  imul   %rcx,%rcx
  imul   %rcx,%rbx
  imul   %rbx,%rbx
  imul   %rbx,%rbp
  jmp    L366
  nopl   0x0(%rax)
L39:
  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
L337:
  imul   %rdi,%rdi
  imul   %rcx,%rdi
L120:
  imul   %rdi,%rdi
  imul   %rdi,%rbx
  imul   %rbx,%rbx
  imul   %rbx,%rbp
  jmp    L366
  nopl   0x0(%rax)
L470:
  imul   %rdi,%rdi
  imul   %rdi,%rbp
  jmp    L58
  nopl   (%rax)
L322:
  imul   %rdi,%rdi
  imul   %rdi,%r12
  jmp    L131
  nopl   (%rax)
L497:
  imul   %rdi,%rdi
  imul   %rdi,%r13
  jmp    L408
  nopl   (%rax)
L460:
  imul   %rdi,%rdi
  imul   %rdi,%r14
  jmp    L422
  nopl   (%rax)
L36:
  imul   %rdi,%rdi
  imul   %rdi,%r15
  jmp    L493
  nopl   (%rax)
L499:
  imul   %rdi,%rdi
  imul   %rdi,%rdx
  jmp    L173
```

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);
  }
}
```