user: 请将以下的汇编代码转换成C语言代码：

```asm
<drive>:
  endbr64
  pxor   %xmm2,%xmm2
  sub    $0x38,%rsp
  movsd  D12(%rip),%xmm6
  cvtsi2ss %edi,%xmm2
  movss  %xmm0,0x18(%rsp)
  movsd  D64(%rip),%xmm0
  movss  %xmm1,0x8(%rsp)
  cvtss2sd %xmm2,%xmm2
  subsd  %xmm2,%xmm6
  movsd  %xmm2,0x10(%rsp)
  mulsd  %xmm6,%xmm0
  divsd  D14(%rip),%xmm0
  call   <cos@plt>
  movsd  0x10(%rsp),%xmm2
  addsd  D12(%rip),%xmm2
  mulsd  D64(%rip),%xmm2
  movss  %xmm0,0xc(%rsp)
  divsd  D14(%rip),%xmm2
  movapd %xmm2,%xmm0
  call   <cos@plt>
  movss  0xc(%rsp),%xmm3
  movss  0x18(%rsp),%xmm7
  movss  %xmm0,0x10(%rsp)
  mulss  %xmm3,%xmm7
  movaps %xmm3,%xmm0
  movss  %xmm3,0x28(%rsp)
  movss  %xmm7,0xc(%rsp)
  call   <fabs@plt>
  movss  0x10(%rsp),%xmm2
  movss  0x18(%rsp),%xmm6
  movss  0x8(%rsp),%xmm5
  mulss  %xmm2,%xmm6
  mulss  %xmm0,%xmm5
  movaps %xmm2,%xmm0
  addss  0xc(%rsp),%xmm5
  movss  %xmm6,0x18(%rsp)
  movss  %xmm5,0x24(%rsp)
  call   <fabs@plt>
  movss  0x8(%rsp),%xmm4
  movss  0x10(%rsp),%xmm2
  mulss  %xmm0,%xmm4
  movaps %xmm2,%xmm0
  addss  0x18(%rsp),%xmm4
  movss  %xmm4,0x20(%rsp)
  call   <fabs@plt>
  mulss  0x8(%rsp),%xmm0
  movss  0x18(%rsp),%xmm8
  movss  0x28(%rsp),%xmm3
  movss  %xmm3,0x18(%rsp)
  subss  %xmm0,%xmm8
  movaps %xmm3,%xmm0
  movss  %xmm8,0x1c(%rsp)
  call   <fabs@plt>
  mulss  0x8(%rsp),%xmm0
  movss  0xc(%rsp),%xmm7
  movss  0x24(%rsp),%xmm5
  movss  %xmm5,0xc(%rsp)
  subss  %xmm0,%xmm7
  movaps %xmm5,%xmm0
  movss  %xmm7,0x2c(%rsp)
  call   <helpFindSign@plt>
  movss  0x18(%rsp),%xmm3
  movss  0xc(%rsp),%xmm5
  movss  %xmm0,0x8(%rsp)
  movaps %xmm3,%xmm1
  movaps %xmm5,%xmm0
  movss  %xmm3,0x28(%rsp)
  call   <helpFindMinAbsFloat@plt>
  movss  0x8(%rsp),%xmm1
  movss  0x20(%rsp),%xmm4
  mulss  %xmm0,%xmm1
  movaps %xmm4,%xmm0
  movss  %xmm4,0x18(%rsp)
  movss  %xmm1,0xc(%rsp)
  call   <helpFindSign@plt>
  movss  0x18(%rsp),%xmm4
  movss  0x10(%rsp),%xmm2
  movss  %xmm0,0x8(%rsp)
  movaps %xmm2,%xmm1
  movaps %xmm4,%xmm0
  call   <helpFindMinAbsFloat@plt>
  movss  0x8(%rsp),%xmm6
  movss  0x1c(%rsp),%xmm8
  mulss  %xmm0,%xmm6
  movaps %xmm8,%xmm0
  movss  %xmm8,0x18(%rsp)
  movss  %xmm6,0x24(%rsp)
  call   <helpFindSign@plt>
  movss  0x18(%rsp),%xmm8
  movss  0x10(%rsp),%xmm2
  movss  %xmm0,0x8(%rsp)
  movaps %xmm2,%xmm1
  movaps %xmm8,%xmm0
  movss  %xmm2,0x20(%rsp)
  call   <helpFindMinAbsFloat@plt>
  movss  0x8(%rsp),%xmm5
  movss  0x2c(%rsp),%xmm7
  mulss  %xmm0,%xmm5
  movaps %xmm7,%xmm0
  movss  %xmm7,0x10(%rsp)
  movss  %xmm5,0x1c(%rsp)
  call   <helpFindSign@plt>
  movss  0x10(%rsp),%xmm7
  movss  0x28(%rsp),%xmm3
  movss  %xmm0,0x8(%rsp)
  movaps %xmm3,%xmm1
  movaps %xmm7,%xmm0
  movss  %xmm3,0x18(%rsp)
  call   <helpFindMinAbsFloat@plt>
  movss  0x8(%rsp),%xmm4
  movss  0x20(%rsp),%xmm2
  movss  0x18(%rsp),%xmm3
  mulss  %xmm0,%xmm4
  movaps %xmm2,%xmm1
  movaps %xmm3,%xmm0
  movss  %xmm4,0x8(%rsp)
  call   <helpFindMaxAbsFloat@plt>
  movss  0x8(%rsp),%xmm4
  movss  0x24(%rsp),%xmm6
  movaps %xmm0,%xmm1
  movss  D73(%rip),%xmm0
  movss  0x1c(%rsp),%xmm5
  divss  %xmm1,%xmm0
  mulss  %xmm0,%xmm4
  mulss  %xmm0,%xmm5
  mulss  %xmm0,%xmm6
  mulss  0xc(%rsp),%xmm0
  movss  %xmm4,0x8(%rsp)
  movss  %xmm5,0x18(%rsp)
  movss  %xmm6,0x10(%rsp)
  call   <helpRoundFloat@plt>
  lea    D28(%rip),%rdi
  mov    %eax,%esi
  call   <printf@plt>
  movss  0x10(%rsp),%xmm6
  movaps %xmm6,%xmm0
  call   <helpRoundFloat@plt>
  lea    D104(%rip),%rdi
  mov    %eax,%esi
  call   <printf@plt>
  movss  0x18(%rsp),%xmm5
  movaps %xmm5,%xmm0
  call   <helpRoundFloat@plt>
  lea    D75(%rip),%rdi
  mov    %eax,%esi
  call   <printf@plt>
  movss  0x8(%rsp),%xmm4
  movaps %xmm4,%xmm0
  call   <helpRoundFloat@plt>
  lea    D39(%rip),%rdi
  add    $0x38,%rsp
  mov    %eax,%esi
  jmp    10b0 <printf@plt>
```

tool_calls: name: disassemble_data
arguments: data_label: D12
datatype: f64
name: disassemble_data
arguments: data_label: D64
datatype: f64
name: disassemble_data
arguments: data_label: D14
datatype: f64
name: disassemble_data
arguments: data_label: D73
datatype: f32
name: disassemble_data
arguments: data_label: D28
datatype: string
name: disassemble_data
arguments: data_label: D104
datatype: string
name: disassemble_data
arguments: data_label: D75
datatype: string
name: disassemble_data
arguments: data_label: D39
datatype: string

tool: D12: 45

tool: D64: 3.141592654

tool: D14: 180

tool: D73: 100

tool: D28: Scaled Power FL: %d


tool: D104: Scaled Power BL: %d


tool: D75: Scaled Power FR: %d


tool: D39: Scaled Power BR: %d


assistant: ```c
void drive(int angle, float powerRatio, float rotationRatio) {
  float maxPowFLBR = cos((45.0 - (float)angle) * 3.141592654 / 180.0);
  float maxPowFRBL = cos((45.0 + (float)angle) * 3.141592654 / 180.0);
  float powFL = (powerRatio * maxPowFLBR) + (rotationRatio * fabs(maxPowFLBR));
  float powBL = (powerRatio * maxPowFRBL) + (rotationRatio * fabs(maxPowFRBL));
  float powFR = (powerRatio * maxPowFRBL) - (rotationRatio * fabs(maxPowFRBL));
  float powBR = (powerRatio * maxPowFLBR) - (rotationRatio * fabs(maxPowFLBR));
  powFL = helpFindSign(powFL) * helpFindMinAbsFloat(powFL, maxPowFLBR);
  powBL = helpFindSign(powBL) * helpFindMinAbsFloat(powBL, maxPowFRBL);
  powFR = helpFindSign(powFR) * helpFindMinAbsFloat(powFR, maxPowFRBL);
  powBR = helpFindSign(powBR) * helpFindMinAbsFloat(powBR, maxPowFLBR);
  float maxRefPow = 100.0;
  float absHighestPow = helpFindMaxAbsFloat(maxPowFLBR, maxPowFRBL);
  float multiplier = maxRefPow / absHighestPow;
  float scaledPowFL = powFL * multiplier;
  float scaledPowBL = powBL * multiplier;
  float scaledPowFR = powFR * multiplier;
  float scaledPowBR = powBR * multiplier;
  printf("Scaled Power FL: %d\n", helpRoundFloat(scaledPowFL));
  printf("Scaled Power BL: %d\n", helpRoundFloat(scaledPowBL));
  printf("Scaled Power FR: %d\n", helpRoundFloat(scaledPowFR));
  printf("Scaled Power BR: %d\n", helpRoundFloat(scaledPowBR));
}
```