字节序

描述数值在内存中的每一个字节排列顺序。

举例说明,以一个32位4字节为例,数值0x1234_5678的小端字节序和大端字节序描述如下:

1. 小端字节序

字节 3 2 1 0
0x12 0x34 0x56 0x78

2. 大端字节序

字节 3 2 1 0
0x78 0x56 0x34 0x12

需要注意的是:

  1. 字节序仅仅描述字节之间的位置关系,并不描述字节内部位序关系。
  2. 对于一个特定的CPU体系结构,位序和字节序保持一致。

大端字节序主要是Power体系结构和网络传输设备。那么小端字节序的CPU和网络之间的进行数据转换时,需进行字节序转换。

飞腾CPU上的字节序

飞腾CPU支持小端字节序。

飞腾CPU上的字节转换指令

飞腾CPU提供五种字节转换指令,具体操作如下

REV <Wd>, <Wn>
REV <Xd>, <Xn>    // REV64 <Xd>, <Xn> 这两条指令是一样的
REV16 <Wd>, <Wn>
REV16 <Xd>, <Xn>
REV32 <Xd>, <Xn>

下面我们用一个32位0x12345678和一个64位0x01234567_89abcdef来介绍上面五种操作的效果。

1. REV <Wd>, <Wn>

字节 3 2 1 0
操作前 0x12 0x34 0x56 0x78
操作后 0x78 0x56 0x34 0x12

2. REV <Xd>, <Xn>

字节 7 6 5 4 3 2 1 0
操作前 0x01 0x23 0x45 0x67 0x89 0xab 0xcd 0xef
操作后 0xef 0xcd 0xab 0x89 0x67 0x45 0x23 0x01

3. REV16 <Wd>, <Wn>

字节 3 2 1 0
操作前 0x12 0x34 0x56 0x78

操作后

0x34 0x12 0x78 0x56

4. REV16 <Xd>, <Xn>

字节 7 6 5 4 3 2 1 0
操作前 0x01 0x23 0x45 0x67 0x89 0xab 0xcd 0xef
操作后 0x23 0x01 0x67 0x45 0xab 0x89 0xef 0xcd

5. REV32 <Xd>, <Xn>

字节 7 6 5 4 3 2 1 0
操作前 0x01 0x23 0x45 0x67 0x89 0xab 0xcd 0xef
操作后 0x67 0x45 0x23 0x01 0xef 0xcd 0xab 0x89

基于上述指令可以实现字节转换的C语言函数为

inline __attribute_const__ __u32 __arch_swab16(__u16 x)
{__asm__("rev16 %w0, %w1" : "=r" (x) : "r" (x));return x;
}inline __attribute_const__ __u32 __arch_swab32(__u32 x)
{__asm__("rev %w0, %w1" : "=r" (x) : "r" (x));return x;
}inline __attribute_const__ __u64 __arch_swab64(__u64 x)
{__asm__("rev %x0, %x1" : "=r" (x) : "r" (x));return x;
}
inline __attribute_const__ __u32 __arch_swahw32(__u32 x)
{__asm__ __volatile__ ("rev32 %x0, %x1\nrev16 %x0, %x0" : "=r" (x) : "r" (x));return x;
}
inline __attribute_const__ __u32 __arch_swahb32(__u32 x)
{__asm__("rev16 %w0, %w1" : "=r" (x) : "r" (x));return x;
}

上述函数的具体意义与下面宏分别对应

#define ___constant_swab16(x) ((__u16)(              \(((__u16)(x) & (__u16)0x00ffU) << 8) |           \(((__u16)(x) & (__u16)0xff00U) >> 8)))#define ___constant_swab32(x) ((__u32)(                \(((__u32)(x) & (__u32)0x000000ffUL) << 24) |     \(((__u32)(x) & (__u32)0x0000ff00UL) <<  8) |     \(((__u32)(x) & (__u32)0x00ff0000UL) >>  8) |     \(((__u32)(x) & (__u32)0xff000000UL) >> 24)))#define ___constant_swab64(x) ((__u64)(              \(((__u64)(x) & (__u64)0x00000000000000ffULL) << 56) |    \(((__u64)(x) & (__u64)0x000000000000ff00ULL) << 40) |    \(((__u64)(x) & (__u64)0x0000000000ff0000ULL) << 24) |    \(((__u64)(x) & (__u64)0x00000000ff000000ULL) <<  8) |    \(((__u64)(x) & (__u64)0x000000ff00000000ULL) >>  8) |    \(((__u64)(x) & (__u64)0x0000ff0000000000ULL) >> 24) |    \(((__u64)(x) & (__u64)0x00ff000000000000ULL) >> 40) |    \(((__u64)(x) & (__u64)0xff00000000000000ULL) >> 56)))#define ___constant_swahw32(x) ((__u32)(            \(((__u32)(x) & (__u32)0x0000ffffUL) << 16) |     \(((__u32)(x) & (__u32)0xffff0000UL) >> 16)))#define ___constant_swahb32(x) ((__u32)(         \(((__u32)(x) & (__u32)0x00ff00ffUL) << 8) |      \(((__u32)(x) & (__u32)0xff00ff00UL) >> 8)))

飞腾CPU体系结构之字节序相关推荐

  1. 飞腾CPU体系结构简单介绍(一)

    第一章 飞腾CPU体系结构简介 ARM体系结构是一种精简指令集体系结构RISC,具有以下基本特点:通用寄存器数量较多:采用统一寻址模式,系统主存和外设分布在CPU物理地址空间的不同范围:采用load/ ...

  2. 飞腾CPU体系结构(十)

    飞腾CPU体系结构(十) 1.高速缓存模型 为了优化整体性能,飞腾CPU芯片内部提供L1高速缓存和L2高速缓存,有些飞腾CPU也提供芯片内部的L3高速缓存,本节不对这个情况进行赘述. 靠近流水线的高速 ...

  3. 飞腾CPU体系结构(十二)

    飞腾CPU体系结构(十二) 1. CPU物理地址空间 飞腾CPU支持的物理地址宽度为44位,物理地址空间实际上只有16TB.系统主存(芯片外部内存)和IO外设(例如SoC设备.PCIe设备)都在这个物 ...

  4. 飞腾CPU体系结构(十一)

    飞腾CPU体系结构(十一) 1. 预取机制 飞腾CPU为了提升性能,支持从外部内存中预取数据到L1或L2缓存中.如果某个缓存块内容不在L1/L2缓存中,当该缓存块的某个地址单元被第一访问时,就会遇到内 ...

  5. 飞腾CPU体系结构(九)

    飞腾CPU体系结构(九) 向量访存指令主要包括LD1/ST1. LD2/ST2.LD3/ST3和LD4/ST4四种. LD1/ST1一般针对一个向量寄存器,也有两个.三个或四个向量寄存器的模式. LD ...

  6. 飞腾CPU体系结构(八)

    飞腾CPU体系结构(八)--标量访存指令 在阅读之前,请先查看<飞腾CPU体系结构(五)>的SIMD和浮点寄存器.飞腾CPU还提供了32个128 位SIMD和浮点寄存器,这32个128位寄 ...

  7. 飞腾CPU体系结构之虚拟地址

    飞腾CPU体系结构之虚拟地址 1. 基本概念 虚拟地址:程序运行时指令和数据对应的地址. 虚拟地址空间:一个进程运行时指令和数据能访问到的虚拟地址范围. 注意事项: 每个进程拥有自己的虚拟地址空间,进 ...

  8. 飞腾CPU体系结构之低功耗指令

    飞腾CPU体系结构之低功耗指令 WFE和WFI指令 当飞腾CPU核执行两类指令:WFE或WFI之后,CPU核会进入低功耗状态: 一旦CPU核进入低功耗状态,就要一直保持低功耗状态直到相应的唤醒事件发生 ...

  9. 飞腾CPU体系结构(十四)

    飞腾CPU体系结构(十四) 1. MMU原理 MMU的大致工作原理是: 64位虚拟地址首先分成虚拟页帧号和页内偏移量两部分,虚拟页帧号即页表项索引:根据页表项索引,在进程的页表里查找到对应页表项,然后 ...

最新文章

  1. 安装ie9提示未能完成安装_IE9浏览器无法安装怎么办?如何解决?
  2. CVPR 2019 | 腾讯AI Lab解读六大前沿方向及33篇入选论文
  3. antd表格显示分页怎么取消_真相!Word里怎么也删不掉的文档空白页原来是这样...
  4. Memcached简介
  5. log4j的相关jar包总结
  6. java rest httpclient_Httpclient与RestTemplate的比较(比httpClient更优雅的Restful URL访问)...
  7. 用计算机来控制飞船在太空中运行,神舟飞船在太空中靠什么动力运行
  8. DevExpress XtraGrid网格控件示例四:初始化新建行的单元格
  9. Monkey 命令 基本参数介绍
  10. 系统分析师成长之路 转
  11. 数字图像入门 色彩的抖动
  12. mac 文档 只读修改
  13. 为什么不能睁一只眼闭一只眼_“睁一只眼,闭一只眼”才是人生的最高境界
  14. OpenJ_Bailian - 3468
  15. SaltStack数据系统
  16. fastlane 上传到蒲公英和Fir 配置
  17. 一不小心把此电脑删了,如何把此电脑添加到桌面?
  18. Excel如何打开两个独立窗口
  19. 光纤网卡和HBA卡有什么区别
  20. 规模化交付OpenStack和Kubernetes,Airship成为顶级OSF项目

热门文章

  1. php生成二维码, 做多级分销,推广,推荐人
  2. AbortSignal
  3. JS数组reduce的25个高级用法
  4. 超全!9种PCB表面处理工艺大对比
  5. WPF 用户控件分享之边上带输入框的圆圈
  6. zip 压缩方式:按标准方式和存储方式压缩
  7. 无线环境下NAS传输速度过慢
  8. 【数字信号调制】正交幅度调制matlab仿真
  9. 69 RGB图像转单色位图
  10. 深入浅出Attribute (中)——Attribute本质论