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

```asm
<print_cpsr>:
  endbr64
  push   %rbp
  push   %rbx
  sub    $0x8,%rsp
  mov    %edi,%ebx
  mov    %rsi,%rbp
  lea    D63(%rip),%rdi
  call   <UART0_SendString@plt>
  mov    %rbp,%rdi
  call   <UART0_SendString@plt>
  lea    D33(%rip),%rdi
  call   <UART0_SendString@plt>
  mov    %ebx,%edi
  call   <UART0_SendData32@plt>
  lea    D15(%rip),%rbp
  mov    %rbp,%rdi
  call   <UART0_SendString@plt>
  lea    D48(%rip),%rdi
  call   <UART0_SendString@plt>
  mov    %ebx,%edi
  shr    $0x1f,%edi
  call   <UART0_SendData32@plt>
  lea    D6(%rip),%rdi
  call   <UART0_SendString@plt>
  mov    %ebx,%edi
  shr    $0x1e,%edi
  and    $0x1,%edi
  call   <UART0_SendData32@plt>
  lea    D60(%rip),%rdi
  call   <UART0_SendString@plt>
  mov    %ebx,%edi
  shr    $0x1d,%edi
  and    $0x1,%edi
  call   <UART0_SendData32@plt>
  lea    D96(%rip),%rdi
  call   <UART0_SendString@plt>
  mov    %ebx,%edi
  shr    $0x1c,%edi
  and    $0x1,%edi
  call   <UART0_SendData32@plt>
  lea    D105(%rip),%rdi
  call   <UART0_SendString@plt>
  mov    %ebx,%edi
  shr    $0x7,%edi
  and    $0x1,%edi
  call   <UART0_SendData32@plt>
  lea    D85(%rip),%rdi
  call   <UART0_SendString@plt>
  mov    %ebx,%edi
  shr    $0x6,%edi
  and    $0x1,%edi
  call   <UART0_SendData32@plt>
  lea    D31(%rip),%rdi
  call   <UART0_SendString@plt>
  mov    %ebx,%edi
  shr    $0x5,%edi
  and    $0x1,%edi
  call   <UART0_SendData32@plt>
  lea    D35(%rip),%rdi
  call   <UART0_SendString@plt>
  and    $0x1f,%ebx
  mov    %ebx,%edi
  call   <UART0_SendData32@plt>
  mov    %rbp,%rdi
  call   <UART0_SendString@plt>
  add    $0x8,%rsp
  pop    %rbx
  pop    %rbp
  ret
```

tool_calls: name: extract_symbolic_data
arguments: label: D63
data_type: string
name: extract_symbolic_data
arguments: label: D33
data_type: string
name: extract_symbolic_data
arguments: label: D15
data_type: string
name: extract_symbolic_data
arguments: label: D48
data_type: string
name: extract_symbolic_data
arguments: label: D6
data_type: string
name: extract_symbolic_data
arguments: label: D60
data_type: string
name: extract_symbolic_data
arguments: label: D96
data_type: string
name: extract_symbolic_data
arguments: label: D105
data_type: string
name: extract_symbolic_data
arguments: label: D85
data_type: string
name: extract_symbolic_data
arguments: label: D31
data_type: string
name: extract_symbolic_data
arguments: label: D35
data_type: string

tool: D63: 
Interrupt Reason:

tool: D33: ,	CPSR = 

tool: D15: 


tool: D48: 	[31], N, Negative:

tool: D6: 	[30], Z, Zero:

tool: D60: 	[29], C, Carry:

tool: D96: 	[28], V, Overflow:

tool: D105: 
	[7], I, IRQ:

tool: D85: 	[6], F, FIQ:

tool: D31: 	[5], T, Thumb:

tool: D35: 	[4:0], Mode:

assistant: ```c
void print_cpsr(unsigned int cpsr, char *why) {
  UART0_SendString("\n\rInterrupt Reason:");
  UART0_SendString(why);
  UART0_SendString(",\tCPSR = ");
  UART0_SendData32(cpsr);
  UART0_SendString("\n\r");
  UART0_SendString("\t[31], N, Negative:");
  UART0_SendData32((cpsr >> 31) & 0x1);
  UART0_SendString("\t[30], Z, Zero:");
  UART0_SendData32((cpsr >> 30) & 0x1);
  UART0_SendString("\t[29], C, Carry:");
  UART0_SendData32((cpsr >> 29) & 0x1);
  UART0_SendString("\t[28], V, Overflow:");
  UART0_SendData32((cpsr >> 28) & 0x1);
  UART0_SendString("\n\r\t[7], I, IRQ:");
  UART0_SendData32((cpsr >> 7) & 0x1);
  UART0_SendString("\t[6], F, FIQ:");
  UART0_SendData32((cpsr >> 6) & 0x1);
  UART0_SendString("\t[5], T, Thumb:");
  UART0_SendData32((cpsr >> 5) & 0x1);
  UART0_SendString("\t[4:0], Mode:");
  UART0_SendData32((cpsr)&0x1f);
  UART0_SendString("\n\r");
}
```