user: 请将以下的汇编代码转换成C语言代码：

```asm
<mi_phy_addr>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x10,%rsp
  mov    %edi,%eax
  mov    %al,-0x4(%rbp)
  movzbl -0x4(%rbp),%eax
  shr    $0x4,%al
  movzbl %al,%eax
  and    $0x1,%eax
  or     $0x8,%eax
  mov    $0xc000c20,%edx
  mov    %ax,(%rdx)
  mov    $0x64,%edi
  call   <udelay@plt>
  movzbl -0x4(%rbp),%eax
  shr    $0x4,%al
  movzbl %al,%eax
  and    $0x1,%eax
  or     $0xc,%eax
  mov    $0xc000c20,%edx
  mov    %ax,(%rdx)
  mov    $0x64,%edi
  call   <udelay@plt>
  movzbl -0x4(%rbp),%eax
  shr    $0x3,%al
  movzbl %al,%eax
  and    $0x1,%eax
  or     $0x8,%eax
  mov    $0xc000c20,%edx
  mov    %ax,(%rdx)
  mov    $0x64,%edi
  call   <udelay@plt>
  movzbl -0x4(%rbp),%eax
  shr    $0x3,%al
  movzbl %al,%eax
  and    $0x1,%eax
  or     $0xc,%eax
  mov    $0xc000c20,%edx
  mov    %ax,(%rdx)
  mov    $0x64,%edi
  call   <udelay@plt>
  movzbl -0x4(%rbp),%eax
  shr    $0x2,%al
  movzbl %al,%eax
  and    $0x1,%eax
  or     $0x8,%eax
  mov    $0xc000c20,%edx
  mov    %ax,(%rdx)
  mov    $0x64,%edi
  call   <udelay@plt>
  movzbl -0x4(%rbp),%eax
  shr    $0x2,%al
  movzbl %al,%eax
  and    $0x1,%eax
  or     $0xc,%eax
  mov    $0xc000c20,%edx
  mov    %ax,(%rdx)
  mov    $0x64,%edi
  call   <udelay@plt>
  movzbl -0x4(%rbp),%eax
  shr    %al
  movzbl %al,%eax
  and    $0x1,%eax
  or     $0x8,%eax
  mov    $0xc000c20,%edx
  mov    %ax,(%rdx)
  mov    $0x64,%edi
  call   <udelay@plt>
  movzbl -0x4(%rbp),%eax
  shr    %al
  movzbl %al,%eax
  and    $0x1,%eax
  or     $0xc,%eax
  mov    $0xc000c20,%edx
  mov    %ax,(%rdx)
  mov    $0x64,%edi
  call   <udelay@plt>
  movzbl -0x4(%rbp),%eax
  and    $0x1,%eax
  or     $0x8,%eax
  mov    $0xc000c20,%edx
  mov    %ax,(%rdx)
  mov    $0x64,%edi
  call   <udelay@plt>
  movzbl -0x4(%rbp),%eax
  and    $0x1,%eax
  or     $0xc,%eax
  mov    $0xc000c20,%edx
  mov    %ax,(%rdx)
  mov    $0x64,%edi
  call   <udelay@plt>
  nop
  leave
  ret
```

assistant: ```c
void mi_phy_addr(unsigned char addr) {
  (*((volatile unsigned short *)(0x0C000000 + ((0x300 + (0x8)) << 2)))) = (((addr >> 4) & 0x1) | 0x0008);
  udelay(100);
  (*((volatile unsigned short *)(0x0C000000 + ((0x300 + (0x8)) << 2)))) = (((addr >> 4) & 0x1) | 0x0008 | 0x0004);
  udelay(100);
  (*((volatile unsigned short *)(0x0C000000 + ((0x300 + (0x8)) << 2)))) = (((addr >> 3) & 0x1) | 0x0008);
  udelay(100);
  (*((volatile unsigned short *)(0x0C000000 + ((0x300 + (0x8)) << 2)))) = (((addr >> 3) & 0x1) | 0x0008 | 0x0004);
  udelay(100);
  (*((volatile unsigned short *)(0x0C000000 + ((0x300 + (0x8)) << 2)))) = (((addr >> 2) & 0x1) | 0x0008);
  udelay(100);
  (*((volatile unsigned short *)(0x0C000000 + ((0x300 + (0x8)) << 2)))) = (((addr >> 2) & 0x1) | 0x0008 | 0x0004);
  udelay(100);
  (*((volatile unsigned short *)(0x0C000000 + ((0x300 + (0x8)) << 2)))) = (((addr >> 1) & 0x1) | 0x0008);
  udelay(100);
  (*((volatile unsigned short *)(0x0C000000 + ((0x300 + (0x8)) << 2)))) = (((addr >> 1) & 0x1) | 0x0008 | 0x0004);
  udelay(100);
  (*((volatile unsigned short *)(0x0C000000 + ((0x300 + (0x8)) << 2)))) = ((addr & 0x1) | 0x0008);
  udelay(100);
  (*((volatile unsigned short *)(0x0C000000 + ((0x300 + (0x8)) << 2)))) = ((addr & 0x1) | 0x0008 | 0x0004);
  udelay(100);
}
```