user: 请从给定的汇编指令推导出C源代码:

```asm
<print_mm_fpor>:
  endbr64
  push   %rbx
  mov    %rdi,%rbx
  test   %rsi,%rsi
  jne    L74
  mov    %edi,%esi
  lea    D32(%rip),%rdi
  call   <printf@plt>
L78:
  test   $0x8,%bl
  je     L99
  mov    $0x8,%esi
  lea    D28(%rip),%rdi
  call   <printf@plt>
L102:
  test   $0x4,%bl
  je     L94
  mov    $0x4,%esi
  lea    D65(%rip),%rdi
  call   <printf@plt>
L109:
  and    $0x3,%ebx
  cmp    $0x2,%rbx
  je     L27
  jg     L110
  test   %rbx,%rbx
  je     L49
  cmp    $0x1,%rbx
  jne    L42
  mov    $0x1,%esi
  lea    D35(%rip),%rdi
  call   <printf@plt>
  jmp    L42
L74:
  mov    %edi,%esi
  lea    D61(%rip),%rdi
  call   <printf@plt>
  jmp    L78
L99:
  mov    $0x0,%esi
  lea    D31(%rip),%rdi
  call   <printf@plt>
  jmp    L102
L94:
  mov    $0x0,%esi
  lea    D73(%rip),%rdi
  call   <printf@plt>
  jmp    L109
L110:
  mov    $0x3,%esi
  lea    D90(%rip),%rdi
  call   <printf@plt>
L42:
  pop    %rbx
  ret
L27:
  mov    $0x2,%esi
  lea    D53(%rip),%rdi
  call   <printf@plt>
  jmp    L42
L49:
  mov    $0x0,%esi
  lea    D75(%rip),%rdi
  call   <printf@plt>
  jmp    L42
```

tool_calls: name: disassemble_data
arguments: data_label: D32
data_type: string
name: disassemble_data
arguments: data_label: D28
data_type: string
name: disassemble_data
arguments: data_label: D65
data_type: string
name: disassemble_data
arguments: data_label: D35
data_type: string
name: disassemble_data
arguments: data_label: D61
data_type: string
name: disassemble_data
arguments: data_label: D31
data_type: string
name: disassemble_data
arguments: data_label: D73
data_type: string
name: disassemble_data
arguments: data_label: D90
data_type: string
name: disassemble_data
arguments: data_label: D53
data_type: string
name: disassemble_data
arguments: data_label: D75
data_type: string

tool: D32:     FPOR    = 0x%08X


tool: D28:                        %01x Low power BOR enabled, when main BOR disabled


tool: D65:                        %01x Retention regulator disabled


tool: D35:                        %01x Brown-out Reset is controlled with the SBOREN bit setting


tool: D61:    AFPOR    = 0x%08X


tool: D31:                        %01x Low power BOR disabled


tool: D73:                        %01x Retention regulator enabled, RETEN in sleep


tool: D90:                        %01x Brown-out Reset enabled in HW, SBOREN bit is disabled


tool: D53:                        %01x Brown-out Reset in enabled only while device is active and disabled in Sleep; SBOREN bit is disabled


tool: D75:                        %01x Brown-out Reset is disabled in HWM SBOREN bit is disabled


assistant: ```c
void print_mm_fpor(uint32_t fpor, uint32_t alternate) {
  if (0 == alternate) {
    printf("    FPOR    = 0x%08X\n", fpor);
  } else {
    printf("   AFPOR    = 0x%08X\n", fpor);
  }
  if (fpor & 0x00000008) {
    printf("                       %01x Low power BOR enabled, when main BOR disabled\n", 0x00000008);
  } else {
    printf("                       %01x Low power BOR disabled\n", 0);
  }
  if (fpor & 0x00000004) {
    printf("                       %01x Retention regulator disabled\n", 0x00000004);
  } else {
    printf("                       %01x Retention regulator enabled, RETEN in sleep\n", 0);
  }
  switch (fpor & 0x00000003) {
  case 0x00000003:
    printf("                       %01x Brown-out Reset enabled in HW, SBOREN bit is disabled\n", 0x00000003);
    break;
  case 0x00000002:
    printf("                       %01x Brown-out Reset in enabled only while device is active and disabled in Sleep; SBOREN bit is disabled\n", 0x00000002);
    break;
  case 0x00000001:
    printf("                       %01x Brown-out Reset is controlled with the SBOREN bit setting\n", 0x00000001);
    break;
  case 0x00000000:
    printf("                       %01x Brown-out Reset is disabled in HWM SBOREN bit is disabled\n", 0x00000000);
    break;
  }
}
```