user: 请显示与下面列出的汇编代码相匹配的C语言实现：

```asm
<print_cpsr>:
  endbr64
  push   %rbp
  mov    %rsi,%rbp
  push   %rbx
  mov    %edi,%ebx
  lea    D15(%rip),%rdi
  sub    $0x8,%rsp
  call   <UART0_SendString@plt>
  mov    %rbp,%rdi
  lea    D106(%rip),%rbp
  call   <UART0_SendString@plt>
  lea    D109(%rip),%rdi
  call   <UART0_SendString@plt>
  mov    %ebx,%edi
  call   <UART0_SendData32@plt>
  mov    %rbp,%rdi
  call   <UART0_SendString@plt>
  lea    D28(%rip),%rdi
  call   <UART0_SendString@plt>
  mov    %ebx,%edi
  shr    $0x1f,%edi
  call   <UART0_SendData32@plt>
  lea    D47(%rip),%rdi
  call   <UART0_SendString@plt>
  mov    %ebx,%edi
  shr    $0x1e,%edi
  and    $0x1,%edi
  call   <UART0_SendData32@plt>
  lea    D90(%rip),%rdi
  call   <UART0_SendString@plt>
  mov    %ebx,%edi
  shr    $0x1d,%edi
  and    $0x1,%edi
  call   <UART0_SendData32@plt>
  lea    D74(%rip),%rdi
  call   <UART0_SendString@plt>
  mov    %ebx,%edi
  shr    $0x1c,%edi
  and    $0x1,%edi
  call   <UART0_SendData32@plt>
  lea    D53(%rip),%rdi
  call   <UART0_SendString@plt>
  mov    %ebx,%edi
  shr    $0x7,%edi
  and    $0x1,%edi
  call   <UART0_SendData32@plt>
  lea    D63(%rip),%rdi
  call   <UART0_SendString@plt>
  mov    %ebx,%edi
  shr    $0x6,%edi
  and    $0x1,%edi
  call   <UART0_SendData32@plt>
  lea    D54(%rip),%rdi
  call   <UART0_SendString@plt>
  mov    %ebx,%edi
  shr    $0x5,%edi
  and    $0x1,%edi
  call   <UART0_SendData32@plt>
  lea    D82(%rip),%rdi
  and    $0x1f,%ebx
  call   <UART0_SendString@plt>
  mov    %ebx,%edi
  call   <UART0_SendData32@plt>
  add    $0x8,%rsp
  mov    %rbp,%rdi
  pop    %rbx
  pop    %rbp
  jmp    1060 <UART0_SendString@plt>
```

tool_calls: name: parse_data
arguments: label: D15
type: string
name: parse_data
arguments: label: D106
type: string
name: parse_data
arguments: label: D109
type: string
name: parse_data
arguments: label: D28
type: string
name: parse_data
arguments: label: D47
type: string
name: parse_data
arguments: label: D90
type: string
name: parse_data
arguments: label: D74
type: string
name: parse_data
arguments: label: D53
type: string
name: parse_data
arguments: label: D63
type: string
name: parse_data
arguments: label: D54
type: string
name: parse_data
arguments: label: D82
type: string

tool: D15: 
Interrupt Reason:

tool: D106: 


tool: D109: ,	CPSR = 

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

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

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

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

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

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

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

tool: D82: 	[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");
}
```