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

```asm
<decode_url>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x430,%rsp
  mov    %rdi,-0x428(%rbp)
  mov    %fs:0x28,%rax
  mov    %rax,-0x8(%rbp)
  xor    %eax,%eax
  mov    -0x428(%rbp),%rcx
  lea    -0x410(%rbp),%rax
  mov    $0x400,%edx
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <strncpy@plt>
  movl   $0x0,-0x414(%rbp)
  jmp    L34
L84:
  mov    -0x414(%rbp),%eax
  cltq
  movzbl -0x410(%rbp,%rax,1),%eax
  cmp    $0x25,%al
  jne    L52
  mov    -0x414(%rbp),%eax
  add    $0x1,%eax
  cltq
  movzbl -0x410(%rbp,%rax,1),%eax
  cmp    $0x40,%al
  jg     L94
  mov    -0x414(%rbp),%eax
  add    $0x1,%eax
  cltq
  movzbl -0x410(%rbp,%rax,1),%eax
  sub    $0x30,%eax
  mov    %al,-0x415(%rbp)
  jmp    L79
L94:
  mov    -0x414(%rbp),%eax
  add    $0x1,%eax
  cltq
  movzbl -0x410(%rbp,%rax,1),%eax
  cmp    $0x60,%al
  jg     L26
  mov    -0x414(%rbp),%eax
  add    $0x1,%eax
  cltq
  movzbl -0x410(%rbp,%rax,1),%eax
  sub    $0x37,%eax
  mov    %al,-0x415(%rbp)
  jmp    L79
L26:
  mov    -0x414(%rbp),%eax
  add    $0x1,%eax
  cltq
  movzbl -0x410(%rbp,%rax,1),%eax
  sub    $0x57,%eax
  mov    %al,-0x415(%rbp)
L79:
  movsbl -0x415(%rbp),%eax
  shl    $0x4,%eax
  mov    %al,-0x415(%rbp)
  mov    -0x414(%rbp),%eax
  add    $0x2,%eax
  cltq
  movzbl -0x410(%rbp,%rax,1),%eax
  cmp    $0x40,%al
  jg     L67
  mov    -0x414(%rbp),%eax
  add    $0x2,%eax
  cltq
  movzbl -0x410(%rbp,%rax,1),%eax
  mov    %eax,%edx
  movzbl -0x415(%rbp),%eax
  add    %edx,%eax
  sub    $0x30,%eax
  mov    %al,-0x415(%rbp)
  jmp    L15
L67:
  mov    -0x414(%rbp),%eax
  add    $0x2,%eax
  cltq
  movzbl -0x410(%rbp,%rax,1),%eax
  cmp    $0x60,%al
  jg     L41
  mov    -0x414(%rbp),%eax
  add    $0x2,%eax
  cltq
  movzbl -0x410(%rbp,%rax,1),%eax
  mov    %eax,%edx
  movzbl -0x415(%rbp),%eax
  add    %edx,%eax
  sub    $0x37,%eax
  mov    %al,-0x415(%rbp)
  jmp    L15
L41:
  mov    -0x414(%rbp),%eax
  add    $0x2,%eax
  cltq
  movzbl -0x410(%rbp,%rax,1),%eax
  mov    %eax,%edx
  movzbl -0x415(%rbp),%eax
  add    %edx,%eax
  sub    $0x57,%eax
  mov    %al,-0x415(%rbp)
L15:
  addl   $0x2,-0x414(%rbp)
  mov    -0x428(%rbp),%rax
  movzbl -0x415(%rbp),%edx
  mov    %dl,(%rax)
  jmp    L11
L52:
  mov    -0x414(%rbp),%eax
  cltq
  movzbl -0x410(%rbp,%rax,1),%edx
  mov    -0x428(%rbp),%rax
  mov    %dl,(%rax)
L11:
  addq   $0x1,-0x428(%rbp)
  addl   $0x1,-0x414(%rbp)
L34:
  mov    -0x414(%rbp),%eax
  cltq
  movzbl -0x410(%rbp,%rax,1),%eax
  test   %al,%al
  jne    L84
  mov    -0x428(%rbp),%rax
  movb   $0x0,(%rax)
  nop
  mov    -0x8(%rbp),%rax
  sub    %fs:0x28,%rax
  je     L5
  call   <__stack_chk_fail@plt>
L5:
  leave
  ret
```

assistant: ```c
void decode_url(char *str) {
  int ii;
  char dec_char;
  char tmp[1024];
  strncpy(tmp, str, 1024);
  ii = 0;
  while (tmp[ii] != '\0') {
    if ('%' == tmp[ii]) {
      if (tmp[ii + 1] < 'A') {
        dec_char = tmp[ii + 1] - '0';
      } else if (tmp[ii + 1] < 'a') {
        dec_char = tmp[ii + 1] - 'A' + 10;
      } else {
        dec_char = tmp[ii + 1] - 'a' + 10;
      }
      dec_char = dec_char << 4;
      if (tmp[ii + 2] < 'A') {
        dec_char += tmp[ii + 2] - '0';
      } else if (tmp[ii + 2] < 'a') {
        dec_char += tmp[ii + 2] - 'A' + 10;
      } else {
        dec_char += tmp[ii + 2] - 'a' + 10;
      }
      ii = ii + 2;
      *str = dec_char;
    } else {
      *str = tmp[ii];
    }
    str++;
    ii++;
  }
  *str = '\0';
}
```