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

```asm
<box_move_face>:
  endbr64
  push   %r15
  push   %r14
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  sub    $0x148,%rsp
  mov    %rdi,%r12
  mov    %esi,%ebx
  mov    %rdx,%r15
  mov    %rcx,0x8(%rsp)
  mov    %fs:0x28,%rax
  mov    %rax,0x138(%rsp)
  xor    %eax,%eax
  movss  D1(%rip),%xmm1
  movss  %xmm1,0x70(%rsp)
  movss  %xmm1,0x74(%rsp)
  movss  %xmm1,0x78(%rsp)
  movss  D10(%rip),%xmm0
  movss  %xmm0,0x7c(%rsp)
  movss  %xmm1,0x80(%rsp)
  movss  %xmm1,0x84(%rsp)
  movss  %xmm0,0x88(%rsp)
  movss  %xmm1,0x8c(%rsp)
  movss  %xmm0,0x90(%rsp)
  movss  %xmm1,0x94(%rsp)
  movss  %xmm1,0x98(%rsp)
  movss  %xmm0,0x9c(%rsp)
  movss  %xmm1,0xa0(%rsp)
  movss  %xmm0,0xa4(%rsp)
  movss  %xmm1,0xa8(%rsp)
  movss  %xmm0,0xac(%rsp)
  movss  %xmm0,0xb0(%rsp)
  movss  %xmm1,0xb4(%rsp)
  movss  %xmm0,0xb8(%rsp)
  movss  %xmm0,0xbc(%rsp)
  movss  %xmm0,0xc0(%rsp)
  movss  %xmm1,0xc4(%rsp)
  movss  %xmm0,0xc8(%rsp)
  movss  %xmm0,0xcc(%rsp)
  movl   $0x0,0xd0(%rsp)
  movl   $0x1,0xd4(%rsp)
  movl   $0x2,0xd8(%rsp)
  movl   $0x3,0xdc(%rsp)
  movl   $0x5,0xe0(%rsp)
  movl   $0x4,0xe4(%rsp)
  movl   $0x7,0xe8(%rsp)
  movl   $0x6,0xec(%rsp)
  movl   $0x0,0xf0(%rsp)
  movl   $0x4,0xf4(%rsp)
  movl   $0x5,0xf8(%rsp)
  movl   $0x1,0xfc(%rsp)
  movl   $0x2,0x100(%rsp)
  movl   $0x6,0x104(%rsp)
  movl   $0x7,0x108(%rsp)
  movl   $0x3,0x10c(%rsp)
  movl   $0x1,0x110(%rsp)
  movl   $0x5,0x114(%rsp)
  movl   $0x6,0x118(%rsp)
  movl   $0x2,0x11c(%rsp)
  movl   $0x0,0x120(%rsp)
  movl   $0x3,0x124(%rsp)
  movl   $0x7,0x128(%rsp)
  movl   $0x4,0x12c(%rsp)
  movl   $0x1,0x10(%rsp)
  movl   $0x0,0x14(%rsp)
  movl   $0x3,0x18(%rsp)
  movl   $0x2,0x1c(%rsp)
  movl   $0x5,0x20(%rsp)
  movl   $0x4,0x24(%rsp)
  call   <box_is_bbox@plt>
  mov    %eax,%edi
  call   <assert@plt>
  movslq %ebx,%rbx
  movslq 0x10(%rsp,%rbx,4),%rax
  shl    $0x4,%rax
  lea    0xd0(%rsp,%rax,1),%rbp
  lea    0x30(%rsp),%rbx
  lea    0x60(%rsp),%r14
  lea    0x70(%rsp),%r13
L17:
  movslq 0x0(%rbp),%rax
  lea    (%rax,%rax,2),%rax
  lea    0x0(%r13,%rax,4),%rsi
  mov    %rbx,%rdx
  mov    %r12,%rdi
  call   <mat4_mul_vec3@plt>
  add    $0x4,%rbp
  add    $0xc,%rbx
  cmp    %r14,%rbx
  jne    L17
  lea    0x30(%rsp),%rbx
  lea    0x60(%rsp),%rsi
  mov    %r15,%rdi
  call   <vec3_copy@plt>
  mov    %rbx,%rdx
  mov    $0x5,%esi
  mov    0x8(%rsp),%rdi
  call   <bbox_from_npoints@plt>
  mov    0x138(%rsp),%rax
  sub    %fs:0x28,%rax
  jne    L8
  add    $0x148,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
L8:
  call   <__stack_chk_fail@plt>
```

tool_calls: name: retrieve_data
arguments: label: D1
data_type: byte[4]
name: retrieve_data
arguments: label: D10
data_type: byte[4]

tool: {"D1": [0x00,0x00,0x80,0xbf]}

tool: {"D10": [0x00,0x00,0x80,0x3f]}

assistant: ```c
void box_move_face(const float b[4][4], int f, const float p[3], float out[4][4]) {
  const float PS[8][3] = {
      {-1, -1, -1}, {+1, -1, -1}, {+1, -1, +1}, {-1, -1, +1}, {-1, +1, -1}, {+1, +1, -1}, {+1, +1, +1}, {-1, +1, +1},
  };
  const int FS[6][4] = {{0, 1, 2, 3}, {5, 4, 7, 6}, {0, 4, 5, 1}, {2, 6, 7, 3}, {1, 5, 6, 2}, {0, 3, 7, 4}};
  const int FO[6] = {1, 0, 3, 2, 5, 4};
  float ps[5][3];
  int i;
  assert(box_is_bbox(b));
  f = FO[f];
  for (i = 0; i < 4; i++)
    mat4_mul_vec3(b, PS[FS[f][i]], ps[i]);
  vec3_copy(p, ps[4]);
  bbox_from_npoints(out, 5, ps);
}
```