文档章节

byteorder.h学习

陈洪波
 陈洪波
发布于 2015/05/19 19:33
字数 798
阅读 21
收藏 0

在typeorder.h头文件中,主要定义了下面几个函数,__u32 ___arch__swab32(__u32 val),___arch__swab64(__u64 val);这两个函数的含义基本上是将32位寄存器中的字节次序变反,将64位寄存器中的字节次序变反。
举个列子,有一个以16进制表示的32位变量,a=0x12345678;其中由于其是十六进制的,所以12占一个字节,34占一个字节,56占一个字节,78占一个字节,则执行上述___arch__swab32(__u32 val)函数之后,其字节次序变反,就变成了a=0x78563412了。

下面是tyepeorder.h的源代码,其中的解释以及学习部分都在注释当中,中间在处理64位的时候,有一段代码我看到就会感到很高兴,在注释中会有体现的。

#ifndef _I386_BYTEORDER_H
#define _I386_BYTEORDER_H

#include <asm/types.h>
#include <linux/compiler.h>

#ifdef __GNUC__

/* For avoiding bswap on i386 */
//未实现
#ifdef __KERNEL__
#endif

//该内联函数的作用是将x的字节次序反转
static __inline__ __attribute_const__ __u32 ___arch__swab32(__u32 x)
{
//bswap指令 是将32位寄存器中的字节的次序变反
#ifdef CONFIG_X86_BSWAP //如果定义了bswap指令,则直接执行该指令
    __asm__("bswap %0" : "=r" (x) : "0" (x));

//xchgb:交换字或者是字节,至少有一个操作书是寄存器,段寄存器不能作为操作数
#else
    /* * 思想就是先交换低字节,将低字节循环左移16位,高字节被换到了低字节位置,再交换字节 */
    __asm__("xchgb %b0,%h0\n\t" /* swap lower bytes,*/
        "rorl $16,%0\n\t"  /* swap words */
        "xchgb %b0,%h0"     /* swap higher bytes */
        :"=q" (x)
        : "0" (x));
#endif
    return x;
}


//该内联函数的作用是将64位字节的次序变反
/** * 他的思想是: * 首先,将64位的先变成两个32位的保存到一个结构中, * 同时与一个64位的变量保存到一个共同体中,在 * 这里,真心能够感受到内核代码的能省内存尽量省的优雅了。 * 虽然说这是一种不太美观的强制类型转换,直接将类型省了, * 但是这样的处理还是非常棒的。 * * 如果定义了bswap汇编指令,则现将其中的两个32位的变量的字节交换, * 再将两个32位的字节交换。 * 如果没有定义bswap指令,则先对其中的两个32位的变量执行上面的 * ___arch__swab32函数,最后再将这两函数个变量交换 * */
static __inline__ __attribute_const__ __u64 ___arch__swab64(__u64 val)
{ 
    union { 
        struct { __u32 a,b; } s;
        __u64 u;
    } v;

    v.u = val;
#ifdef CONFIG_X86_BSWAP
    asm("bswapl %0 ; bswapl %1 ; xchgl %0,%1" 
        : "=r" (v.s.a), "=r" (v.s.b) 
        : "0" (v.s.a), "1" (v.s.b)); 
#else
   v.s.a = ___arch__swab32(v.s.a); 
    v.s.b = ___arch__swab32(v.s.b); 
    asm("xchgl %0,%1" : "=r" (v.s.a), "=r" (v.s.b) : "0" (v.s.a), "1" (v.s.b));
#endif
    return v.u; 
} 

/* Do not define swab16. Gcc is smart enough to recognize "C" version and convert it into rotation or exhange. */
/* 不用定义16位的字节变反函数,因为gcc是非常聪明的,他能够识别“C”版本,并且 将其转化成旋转或者是交换 */

#define __arch__swab64(x) ___arch__swab64(x)
#define __arch__swab32(x) ___arch__swab32(x)

#define __BYTEORDER_HAS_U64__

#endif /* __GNUC__ */

#include <linux/byteorder/little_endian.h>

#endif /* _I386_BYTEORDER_H */

学了之前的GCC内嵌汇编之后,看其中的汇编的时候就不会那么吃力了。

本文转载自:http://blog.csdn.net/hongbochen1223/article/details/45117691

陈洪波
粉丝 2
博文 76
码字总数 1552
作品 0
济南
程序员
私信 提问
黑客花无涯:Linux 入侵常用命令

请点击此处输入图片描述 写个php一句话后门上去: [jobcruit@wa64-054 rankup_log]$ echo -e "" >rankuplog_time.php [jobcruit@wa64-054 rankup_log]$ cat rankuplog_time.php 1、linux的想......

花无涯
2018/01/01
0
0

没有更多内容

加载失败,请刷新页面

加载更多

没有更多内容

mysql-connector-java升级到8.0后保存时间到数据库出现了时差

在一个新项目中用到了新版的mysql jdbc 驱动 <dependency>     <groupId>mysql</groupId>     <artifactId>mysql-connector-java</artifactId>     <version>8.0.18</version> ......

ValSong
今天
5
0
Spring Boot 如何部署到 Linux 中的服务

打包完成后的 Spring Boot 程序如何部署到 Linux 上的服务? 你可以参考官方的有关部署 Spring Boot 为 Linux 服务的文档。 文档链接如下: https://docs.ossez.com/spring-boot-docs/docs/r...

honeymoose
今天
6
0
Spring Boot 2 实战:使用 Spring Boot Admin 监控你的应用

1. 前言 生产上对 Web 应用 的监控是十分必要的。我们可以近乎实时来对应用的健康、性能等其他指标进行监控来及时应对一些突发情况。避免一些故障的发生。对于 Spring Boot 应用来说我们可以...

码农小胖哥
今天
9
0
ZetCode 教程翻译计划正式启动 | ApacheCN

原文:ZetCode 协议:CC BY-NC-SA 4.0 欢迎任何人参与和完善:一个人可以走的很快,但是一群人却可以走的更远。 ApacheCN 学习资源 贡献指南 本项目需要校对,欢迎大家提交 Pull Request。 ...

ApacheCN_飞龙
今天
5
0
CSS定位

CSS定位 relative相对定位 absolute绝对定位 fixed和sticky及zIndex relative相对定位 position特性:css position属性用于指定一个元素在文档中的定位方式。top、right、bottom、left属性则...

studywin
今天
9
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部