user: Translate the below assembly code into C programming language:

```asm
<print_cpsr>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x10,%rsp
  mov    %edi,-0x4(%rbp)
  mov    %rsi,-0x10(%rbp)
  lea    D67(%rip),%rax
  mov    %rax,%rdi
  call   <UART0_SendString@plt>
  mov    -0x10(%rbp),%rax
  mov    %rax,%rdi
  call   <UART0_SendString@plt>
  lea    D53(%rip),%rax
  mov    %rax,%rdi
  call   <UART0_SendString@plt>
  mov    -0x4(%rbp),%eax
  mov    %eax,%edi
  call   <UART0_SendData32@plt>
  lea    D76(%rip),%rax
  mov    %rax,%rdi
  call   <UART0_SendString@plt>
  lea    D2(%rip),%rax
  mov    %rax,%rdi
  call   <UART0_SendString@plt>
  mov    -0x4(%rbp),%eax
  shr    $0x1f,%eax
  mov    %eax,%edi
  call   <UART0_SendData32@plt>
  lea    D31(%rip),%rax
  mov    %rax,%rdi
  call   <UART0_SendString@plt>
  mov    -0x4(%rbp),%eax
  shr    $0x1e,%eax
  and    $0x1,%eax
  mov    %eax,%edi
  call   <UART0_SendData32@plt>
  lea    D81(%rip),%rax
  mov    %rax,%rdi
  call   <UART0_SendString@plt>
  mov    -0x4(%rbp),%eax
  shr    $0x1d,%eax
  and    $0x1,%eax
  mov    %eax,%edi
  call   <UART0_SendData32@plt>
  lea    D104(%rip),%rax
  mov    %rax,%rdi
  call   <UART0_SendString@plt>
  mov    -0x4(%rbp),%eax
  shr    $0x1c,%eax
  and    $0x1,%eax
  mov    %eax,%edi
  call   <UART0_SendData32@plt>
  lea    D54(%rip),%rax
  mov    %rax,%rdi
  call   <UART0_SendString@plt>
  mov    -0x4(%rbp),%eax
  shr    $0x7,%eax
  and    $0x1,%eax
  mov    %eax,%edi
  call   <UART0_SendData32@plt>
  lea    D10(%rip),%rax
  mov    %rax,%rdi
  call   <UART0_SendString@plt>
  mov    -0x4(%rbp),%eax
  shr    $0x6,%eax
  and    $0x1,%eax
  mov    %eax,%edi
  call   <UART0_SendData32@plt>
  lea    D110(%rip),%rax
  mov    %rax,%rdi
  call   <UART0_SendString@plt>
  mov    -0x4(%rbp),%eax
  shr    $0x5,%eax
  and    $0x1,%eax
  mov    %eax,%edi
  call   <UART0_SendData32@plt>
  lea    D114(%rip),%rax
  mov    %rax,%rdi
  call   <UART0_SendString@plt>
  mov    -0x4(%rbp),%eax
  and    $0x1f,%eax
  mov    %eax,%edi
  call   <UART0_SendData32@plt>
  lea    D76(%rip),%rax
  mov    %rax,%rdi
  call   <UART0_SendString@plt>
  nop
  leave
  ret
```

tool_calls: name: unpack_data
arguments: tag: D67
type_infered: string
name: unpack_data
arguments: tag: D53
type_infered: string
name: unpack_data
arguments: tag: D76
type_infered: string
name: unpack_data
arguments: tag: D2
type_infered: string
name: unpack_data
arguments: tag: D31
type_infered: string
name: unpack_data
arguments: tag: D81
type_infered: string
name: unpack_data
arguments: tag: D104
type_infered: string
name: unpack_data
arguments: tag: D54
type_infered: string
name: unpack_data
arguments: tag: D10
type_infered: string
name: unpack_data
arguments: tag: D110
type_infered: string
name: unpack_data
arguments: tag: D114
type_infered: string

tool: D67: 
Interrupt Reason:

tool: D53: ,	CPSR = 

tool: D76: 


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

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

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

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

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

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

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

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