user: 下面的汇编指令对应的C源代码是什么：

```asm
<fiducial120_id_from_symbol_sequence>:
  endbr64
  push   %rbp
  mov    %rdi,%rbp
  push   %rbx
  mov    %esi,%ebx
  sub    $0x58,%rsp
  movdqa D26(%rip),%xmm0
  mov    %fs:0x28,%rax
  mov    %rax,0x48(%rsp)
  xor    %eax,%eax
  mov    (%rdi),%eax
  xor    %edi,%edi
  movaps %xmm0,(%rsp)
  movdqa D17(%rip),%xmm0
  test   %eax,%eax
  movaps %xmm0,0x10(%rsp)
  movdqa D37(%rip),%xmm0
  sete   %dil
  movaps %xmm0,0x20(%rsp)
  movdqa D31(%rip),%xmm0
  movaps %xmm0,0x30(%rsp)
  call   <assert@plt>
  xor    %edi,%edi
  cmp    $0x8,%ebx
  setle  %dil
  call   <assert@plt>
  lea    -0x1(%rbx),%edi
  test   %edi,%edi
  jle    L72
  movslq %ebx,%rax
  lea    0x4(%rbp),%rcx
  lea    0x20(%rsp),%r10
  xor    %r8d,%r8d
  lea    -0x8(%rsp,%rax,4),%rsi
  lea    -0x2(%rbx),%eax
  pcmpeqd %xmm1,%xmm1
  lea    0x8(%rbp,%rax,4),%r9
  nopw   0x0(%rax,%rax,1)
L19:
  mov    (%rcx),%eax
  lea    -0x1(%rax),%edx
  movslq %edx,%rdx
  mov    0x20(%rsp,%rdx,4),%edx
  imul   (%rsi),%edx
  add    %edx,%r8d
  cmp    %edi,%eax
  jge    L48
  mov    %ebx,%edx
  sub    %eax,%edx
  lea    -0x1(%rdx),%r11d
  sub    $0x2,%edx
  cmp    $0x2,%edx
  jbe    L42
  movslq %eax,%rdx
  mov    %r11d,%ebp
  lea    (%r10,%rdx,4),%rdx
  shr    $0x2,%ebp
  movdqu (%rdx),%xmm0
  paddd  %xmm1,%xmm0
  movups %xmm0,(%rdx)
  cmp    $0x1,%ebp
  je     L46
  movdqu 0x10(%rdx),%xmm0
  paddd  %xmm1,%xmm0
  movups %xmm0,0x10(%rdx)
L46:
  mov    %r11d,%edx
  and    $0xfffffffc,%edx
  add    %edx,%eax
  cmp    %r11d,%edx
  je     L48
L42:
  movslq %eax,%rdx
  subl   $0x1,0x20(%rsp,%rdx,4)
  lea    0x1(%rax),%edx
  cmp    %edx,%edi
  jle    L48
  movslq %edx,%rdx
  add    $0x2,%eax
  subl   $0x1,0x20(%rsp,%rdx,4)
  cmp    %eax,%edi
  jle    L48
  cltq
  subl   $0x1,0x20(%rsp,%rax,4)
L48:
  add    $0x4,%rcx
  sub    $0x4,%rsi
  cmp    %rcx,%r9
  jne    L19
L57:
  mov    0x48(%rsp),%rax
  sub    %fs:0x28,%rax
  jne    L87
  add    $0x58,%rsp
  mov    %r8d,%eax
  pop    %rbx
  pop    %rbp
  ret
L72:
  xor    %r8d,%r8d
  jmp    L57
L87:
  call   <__stack_chk_fail@plt>
```

tool_calls: name: disassemble_data
arguments: label: D26
type: byte[16]
name: disassemble_data
arguments: label: D17
type: byte[16]
name: disassemble_data
arguments: label: D37
type: byte[16]
name: disassemble_data
arguments: label: D31
type: byte[16]

tool: {"D26": [0x01,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x06,0x00,0x00,0x00]}

tool: {"D17": [0x18,0x00,0x00,0x00,0x78,0x00,0x00,0x00,0xd0,0x02,0x00,0x00,0xb0,0x13,0x00,0x00]}

tool: {"D37": [0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x03,0x00,0x00,0x00]}

tool: {"D31": [0x04,0x00,0x00,0x00,0x05,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x07,0x00,0x00,0x00]}

assistant: ```c
int fiducial120_id_from_symbol_sequence(int *sequence, int length) {
  int id = 0;
  int factorial[8] = {1, 1, 2, 6, 24, 120, 720, 5040};
  int mapping[8] = {0, 1, 2, 3, 4, 5, 6, 7};
  int i, j;
  assert(sequence[0] == 0);
  assert(length <= 8);
  sequence = sequence + 1;
  length = length - 1;
  for (i = 0; i < length; ++i) {
    id += mapping[(sequence[i] - 1)] * factorial[(length - 1) - i];
    for (j = (sequence[i] - 1) + 1; j < length; ++j) {
      mapping[j]--;
    }
  }
  return id;
}
```