user: 请将这段汇编代码片段转换成等效的C代码:

```asm
<read_temp_sensor>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x30,%rsp
  mov    %rdi,-0x28(%rbp)
  mov    %fs:0x28,%rax
  mov    %rax,-0x8(%rbp)
  xor    %eax,%eax
  mov    $0x0,%eax
  call   <TouchReset@plt>
  mov    $0x55,%edi
  call   <TouchByte@plt>
  movl   $0x7,-0x1c(%rbp)
  jmp    L25
L7:
  mov    -0x1c(%rbp),%eax
  movslq %eax,%rdx
  mov    -0x28(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  mov    %eax,%edi
  call   <TouchByte@plt>
  subl   $0x1,-0x1c(%rbp)
L25:
  cmpl   $0x0,-0x1c(%rbp)
  jns    L7
  mov    $0xbe,%edi
  call   <TouchByte@plt>
  mov    $0xff,%edi
  call   <TouchByte@plt>
  mov    %al,-0x10(%rbp)
  mov    $0xff,%edi
  call   <TouchByte@plt>
  mov    %al,-0xf(%rbp)
  mov    $0xff,%edi
  call   <TouchByte@plt>
  mov    %al,-0xe(%rbp)
  mov    $0xff,%edi
  call   <TouchByte@plt>
  mov    %al,-0xd(%rbp)
  mov    $0xff,%edi
  call   <TouchByte@plt>
  mov    %al,-0xc(%rbp)
  mov    $0xff,%edi
  call   <TouchByte@plt>
  mov    %al,-0xb(%rbp)
  mov    $0xff,%edi
  call   <TouchByte@plt>
  mov    %al,-0xa(%rbp)
  mov    $0xff,%edi
  call   <TouchByte@plt>
  mov    %al,-0x9(%rbp)
  mov    $0xff,%edi
  call   <TouchByte@plt>
  mov    %al,-0x1d(%rbp)
  mov    $0x0,%eax
  call   <TouchReset@plt>
  movzbl -0x10(%rbp),%eax
  shr    %al
  mov    %al,-0x1e(%rbp)
  movzbl -0xf(%rbp),%eax
  test   %al,%al
  je     L9
  orb    $0x80,-0x1e(%rbp)
L9:
  movzbl -0x9(%rbp),%eax
  test   %al,%al
  je     L30
  movzbl -0x9(%rbp),%eax
  movzbl %al,%eax
  movzbl -0xa(%rbp),%edx
  movzbl %dl,%edx
  sub    %edx,%eax
  pxor   %xmm0,%xmm0
  cvtsi2ss %eax,%xmm0
  movzbl -0x9(%rbp),%eax
  movzbl %al,%eax
  pxor   %xmm1,%xmm1
  cvtsi2ss %eax,%xmm1
  divss  %xmm1,%xmm0
  movss  %xmm0,-0x18(%rbp)
  jmp    L50
L30:
  movss  D9(%rip),%xmm0
  movss  %xmm0,-0x18(%rbp)
L50:
  movsbl -0x1e(%rbp),%eax
  pxor   %xmm0,%xmm0
  cvtsi2ss %eax,%xmm0
  cvtss2sd %xmm0,%xmm0
  movsd  D12(%rip),%xmm2
  movapd %xmm0,%xmm1
  subsd  %xmm2,%xmm1
  pxor   %xmm0,%xmm0
  cvtss2sd -0x18(%rbp),%xmm0
  addsd  %xmm1,%xmm0
  cvtsd2ss %xmm0,%xmm0
  movss  %xmm0,-0x14(%rbp)
  lea    -0x10(%rbp),%rax
  mov    $0x8,%esi
  mov    %rax,%rdi
  call   <CHECKSUM@plt>
  cmp    %al,-0x1d(%rbp)
  je     L3
  mov    $0x0,%eax
  call   <global_temp_sample@plt>
  mov    $0x258,%edi
  call   <delay@plt>
  mov    -0x28(%rbp),%rax
  mov    %rax,%rdi
  call   <read_temp_sensor>
  movd   %xmm0,%eax
  mov    %eax,-0x14(%rbp)
L3:
  movss  -0x14(%rbp),%xmm0
  mov    -0x8(%rbp),%rax
  sub    %fs:0x28,%rax
  je     L62
  call   <__stack_chk_fail@plt>
L62:
  leave
  ret
```

tool_calls: name: parse_data
arguments: data_tag: D9
data_type: f32
name: parse_data
arguments: data_tag: D12
data_type: byte[8]

tool: D9: 0.25

tool: {"D12": [0x00,0x00,0x00,0x00,0x00,0x00,0xd0,0x3f]}

assistant: ```c
float read_temp_sensor(unsigned char *serialnumber) {
  int serialnumber_loop;
  unsigned char BYTE[8], CRC;
  signed char degree;
  float degree_fraction, sensor_temp_reading;
  TouchReset();
  TouchByte(0x55);
  for (serialnumber_loop = 7; serialnumber_loop >= 0; serialnumber_loop--) {
    TouchByte(serialnumber[serialnumber_loop]);
  }
  TouchByte(0xBE);
  BYTE[0] = TouchByte(0xFF);
  BYTE[1] = TouchByte(0xFF);
  BYTE[2] = TouchByte(0xFF);
  BYTE[3] = TouchByte(0xFF);
  BYTE[4] = TouchByte(0xFF);
  BYTE[5] = TouchByte(0xFF);
  BYTE[6] = TouchByte(0xFF);
  BYTE[7] = TouchByte(0xFF);
  CRC = TouchByte(0xFF);
  TouchReset();
  degree = BYTE[0] >> 1;
  if (BYTE[1] != 0) {
    degree = degree | 0x80;
  }
  if (BYTE[7] != 0) {
    degree_fraction = ((float)(BYTE[7] - BYTE[6])) / ((float)BYTE[7]);
  } else {
    degree_fraction = 0.25;
  }
  sensor_temp_reading = ((float)degree) - 0.25 + degree_fraction;
  if (CRC != CHECKSUM(BYTE, sizeof(BYTE))) {
    global_temp_sample();
    delay(600);
    sensor_temp_reading = read_temp_sensor(serialnumber);
  }
  return (sensor_temp_reading);
}
```