user: Demonstrate the C code that generates the assembly output below:

```asm
<SHT2x_MeasureHM>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x30,%rsp
  mov    %edi,%eax
  mov    %rsi,-0x30(%rbp)
  mov    %al,-0x24(%rbp)
  mov    %fs:0x28,%rax
  mov    %rax,-0x8(%rbp)
  xor    %eax,%eax
  movb   $0x0,-0x14(%rbp)
  movb   $0x0,-0x13(%rbp)
  movw   $0x0,-0x12(%rbp)
  pxor   %xmm0,%xmm0
  movss  %xmm0,-0x10(%rbp)
  movb   $0x80,-0x13(%rbp)
  mov    $0x0,%eax
  call   <IIC_Start@plt>
  movzbl -0x13(%rbp),%eax
  mov    %eax,%edi
  call   <IIC_SendByte@plt>
  mov    $0xc350,%edi
  call   <IIC_WaitAck@plt>
  test   %rax,%rax
  je     L64
  pxor   %xmm0,%xmm0
  jmp    L9
L64:
  movzbl -0x24(%rbp),%eax
  mov    %eax,%edi
  call   <IIC_SendByte@plt>
  mov    $0xc350,%edi
  call   <IIC_WaitAck@plt>
  test   %rax,%rax
  je     L96
  pxor   %xmm0,%xmm0
  jmp    L9
L96:
  mov    $0x0,%eax
  call   <IIC_Start@plt>
  movzbl -0x13(%rbp),%eax
  add    $0x1,%eax
  movzbl %al,%eax
  mov    %eax,%edi
  call   <IIC_SendByte@plt>
  jmp    L1
L48:
  mov    $0x0,%eax
  call   <IIC_Start@plt>
  movzbl -0x13(%rbp),%eax
  add    $0x1,%eax
  movzbl %al,%eax
  mov    %eax,%edi
  call   <IIC_SendByte@plt>
L1:
  mov    $0xc350,%edi
  call   <IIC_WaitAck@plt>
  test   %rax,%rax
  jne    L48
  mov    $0x46,%edi
  call   <DelayXms@plt>
  mov    $0x0,%eax
  call   <IIC_RecvByte@plt>
  mov    %al,-0xa(%rbp)
  mov    $0x0,%eax
  call   <IIC_Ack@plt>
  mov    $0x0,%eax
  call   <IIC_RecvByte@plt>
  mov    %al,-0x9(%rbp)
  mov    $0x0,%eax
  call   <IIC_Ack@plt>
  mov    $0x0,%eax
  call   <IIC_RecvByte@plt>
  mov    %al,-0x14(%rbp)
  mov    $0x0,%eax
  call   <IIC_NAck@plt>
  mov    $0x0,%eax
  call   <IIC_Stop@plt>
  movsbl -0x14(%rbp),%edx
  lea    -0xa(%rbp),%rax
  mov    $0x2,%esi
  mov    %rax,%rdi
  call   <SHT2x_CheckCrc@plt>
  movzbl -0xa(%rbp),%eax
  cbtw
  shl    $0x8,%eax
  mov    %eax,%edx
  movzbl -0x9(%rbp),%eax
  cbtw
  add    %edx,%eax
  mov    %ax,-0x12(%rbp)
  cmpb   $0xe3,-0x24(%rbp)
  jne    L68
  movzwl -0x12(%rbp),%eax
  mov    %eax,%edi
  call   <SHT2x_CalcTemperatureC@plt>
  movd   %xmm0,%eax
  mov    %eax,-0x10(%rbp)
  jmp    L36
L68:
  movzwl -0x12(%rbp),%eax
  mov    %eax,%edi
  call   <SHT2x_CalcRH@plt>
  movd   %xmm0,%eax
  mov    %eax,-0x10(%rbp)
L36:
  cmpq   $0x0,-0x30(%rbp)
  je     L75
  cvttss2si -0x10(%rbp),%eax
  mov    %eax,%edx
  mov    -0x30(%rbp),%rax
  mov    %dx,(%rax)
L75:
  movss  -0x10(%rbp),%xmm0
L9:
  mov    -0x8(%rbp),%rax
  sub    %fs:0x28,%rax
  je     L82
  call   <__stack_chk_fail@plt>
L82:
  leave
  ret
```

assistant: ```c
float SHT2x_MeasureHM(unsigned char cmd, unsigned short *pMeasurand) {
  char checksum = 0;
  char data[2];
  unsigned char addr = 0;
  unsigned short tmp = 0;
  float t = 0;
  addr = 0X40 << 1;
  IIC_Start();
  IIC_SendByte(addr);
  if (IIC_WaitAck(50000))
    return 0.0;
  IIC_SendByte(cmd);
  if (IIC_WaitAck(50000))
    return 0.0;
  IIC_Start();
  IIC_SendByte(addr + 1);
  while (IIC_WaitAck(50000)) {
    IIC_Start();
    IIC_SendByte(addr + 1);
  }
  DelayXms(70);
  data[0] = IIC_RecvByte();
  IIC_Ack();
  data[1] = IIC_RecvByte();
  IIC_Ack();
  checksum = IIC_RecvByte();
  IIC_NAck();
  IIC_Stop();
  SHT2x_CheckCrc(data, 2, checksum);
  tmp = (data[0] << 8) + data[1];
  if (cmd == 0XE3) {
    t = SHT2x_CalcTemperatureC(tmp);
  } else {
    t = SHT2x_CalcRH(tmp);
  }
  if (pMeasurand) {
    *pMeasurand = (unsigned short)t;
  }
  return t;
}
```