user: Translate the below assembly code into C programming language:

```asm
<aes_block_decrypt>:
  endbr64
  push   %r14
  mov    %rdi,%r8
  mov    %rdx,%rdi
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  mov    %rsi,%rbx
  mov    %ecx,%esi
  mov    %esi,%r12d
  sar    $0x2,%r12d
  sub    $0x120,%rsp
  movzbl 0xd(%r8),%edx
  movzbl 0xb(%r8),%r9d
  add    $0x6,%r12d
  mov    %fs:0x28,%rax
  mov    %rax,0x118(%rsp)
  xor    %eax,%eax
  movzbl 0x9(%r8),%eax
  movzbl (%r8),%ecx
  lea    0x20(%rsp),%r14
  shl    $0x8,%rdx
  lea    0x0(,%r12,4),%r13d
  lea    0x10(%rsp),%rbp
  or     %rax,%rdx
  movzbl 0x5(%r8),%eax
  movslq %r13d,%r13
  shl    $0x8,%rdx
  or     %rax,%rdx
  movzbl 0x1(%r8),%eax
  shl    $0x8,%rdx
  or     %rax,%rdx
  movzbl 0xc(%r8),%eax
  shl    $0x8,%rdx
  or     %rax,%rdx
  movzbl 0x8(%r8),%eax
  shl    $0x8,%rdx
  or     %rax,%rdx
  movzbl 0x4(%r8),%eax
  shl    $0x8,%rdx
  or     %rax,%rdx
  movzbl 0xf(%r8),%eax
  shl    $0x8,%rdx
  shl    $0x8,%rax
  or     %rcx,%rdx
  or     %r9,%rax
  movzbl 0x7(%r8),%r9d
  mov    %rdx,(%rsp)
  mov    %r14,%rdx
  shl    $0x8,%rax
  or     %r9,%rax
  movzbl 0x3(%r8),%r9d
  shl    $0x8,%rax
  or     %r9,%rax
  movzbl 0xe(%r8),%r9d
  shl    $0x8,%rax
  or     %r9,%rax
  movzbl 0xa(%r8),%r9d
  shl    $0x8,%rax
  or     %r9,%rax
  movzbl 0x6(%r8),%r9d
  movzbl 0x2(%r8),%r8d
  shl    $0x8,%rax
  or     %r9,%rax
  shl    $0x8,%rax
  or     %r8,%rax
  mov    %rax,0x8(%rsp)
  movdqa (%rsp),%xmm1
  movaps %xmm1,0x10(%rsp)
  call   <compute_key_schedule@plt>
  shl    $0x2,%r13
  mov    %rbp,%rdi
  lea    (%r14,%r13,1),%rsi
  lea    -0x10(%r14,%r13,1),%r13
  call   <add_round_key@plt>
  jmp    L21
  nopl   0x0(%rax)
L24:
  mov    %rbp,%rdi
  sub    $0x1,%r12d
  call   <inversion_mix_columns@plt>
L21:
  test   %r12d,%r12d
  jle    L9
  mov    %rbp,%rdi
  call   <inversion_shift_rows@plt>
  mov    %rbp,%rdi
  call   <inversion_subsitution_bytes@plt>
  mov    %r13,%rsi
  mov    %rbp,%rdi
  sub    $0x10,%r13
  call   <add_round_key@plt>
  cmp    $0x1,%r12d
  jne    L24
L9:
  movzbl 0x1d(%rsp),%edx
  movzbl 0x19(%rsp),%eax
  movzbl 0x1b(%rsp),%esi
  movzbl 0x10(%rsp),%ecx
  shl    $0x8,%rdx
  or     %rax,%rdx
  movzbl 0x15(%rsp),%eax
  shl    $0x8,%rdx
  or     %rax,%rdx
  movzbl 0x11(%rsp),%eax
  shl    $0x8,%rdx
  or     %rax,%rdx
  movzbl 0x1c(%rsp),%eax
  shl    $0x8,%rdx
  or     %rax,%rdx
  movzbl 0x18(%rsp),%eax
  shl    $0x8,%rdx
  or     %rax,%rdx
  movzbl 0x14(%rsp),%eax
  shl    $0x8,%rdx
  or     %rax,%rdx
  movzbl 0x1f(%rsp),%eax
  shl    $0x8,%rdx
  shl    $0x8,%rax
  or     %rcx,%rdx
  or     %rsi,%rax
  movzbl 0x17(%rsp),%esi
  mov    %rdx,(%rsp)
  shl    $0x8,%rax
  or     %rsi,%rax
  movzbl 0x13(%rsp),%esi
  shl    $0x8,%rax
  or     %rsi,%rax
  movzbl 0x1e(%rsp),%esi
  shl    $0x8,%rax
  or     %rsi,%rax
  movzbl 0x1a(%rsp),%esi
  shl    $0x8,%rax
  or     %rsi,%rax
  movzbl 0x16(%rsp),%esi
  shl    $0x8,%rax
  or     %rsi,%rax
  movzbl 0x12(%rsp),%esi
  shl    $0x8,%rax
  or     %rsi,%rax
  mov    %rax,0x8(%rsp)
  movdqa (%rsp),%xmm0
  movups %xmm0,(%rbx)
  mov    0x118(%rsp),%rax
  sub    %fs:0x28,%rax
  jne    L30
  add    $0x120,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  ret
L30:
  call   <__stack_chk_fail@plt>
```

assistant: ```c
void aes_block_decrypt(const unsigned char *input_block, unsigned char *output_block, const unsigned char *key, int key_size) {
  int i;
  int j;
  int ronde;
  int number;
  unsigned char state[4][4];
  unsigned char w[60][4];
  for (i = 0; i < 4; i++) {
    for (j = 0; j < 4; j++) {
      state[i][j] = input_block[i + (j * 4)];
    }
  }
  number = (key_size >> 2) + 6;
  compute_key_schedule(key, key_size, w);
  add_round_key(state, &w[number * 4]);
  for (ronde = number; ronde > 0; ronde--) {
    inversion_shift_rows(state);
    inversion_subsitution_bytes(state);
    add_round_key(state, &w[(ronde - 1) * 4]);
    if (ronde > 1) {
      inversion_mix_columns(state);
    }
  }
  for (i = 0; i < 4; i++) {
    for (j = 0; j < 4; j++) {
      output_block[i + (4 * j)] = state[i][j];
    }
  }
}
```