typeorder.h学习

在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内嵌汇编之后,看其中的汇编的时候就不会那么吃力了。

时间: 2024-10-11 16:02:07

typeorder.h学习的相关文章

【IOS学习基础】NSObject.h学习

一.<NSObject>协议和代理模式 1.在NSObject.h头文件中,我们可以看到 // NSObject类是默认遵守<NSObject>协议的 @interface NSObject <NSObject> { Class isa OBJC_ISA_AVAILABILITY; } // 往上翻看到NSObject协议的声明@protocol NSObject/* 中间一大堆方法的声明*/@end 然后我就产生疑问了,为什么我们自己定义的协议是这样,后面加上了<

三W一H学习法

What: 是什么 - 它的介绍 Why: 为什么使用 - 你为什么想到用它,想解决什么问题 How: 怎么用 - 首先做出一个最简单的例子,运行一下 When: 使用场景 - 结合逻辑和业务,决定它的位置 原文地址:https://www.cnblogs.com/yulonglyw/p/9655081.html

[转]C/C++关于string.h头文件和string类

学习C语言时,用字符串的函数例如stpcpy().strcat().strcmp()等,要包含头文件string.h 学习C++后,C++有字符串的标准类string,string类也有很多方法,用string类时要用到string.h头文件. 我现在看vc的书上也有CString类,这个要包含什么,怎么用? 我现在很迷惑,这两个 string.h有什么区别.是怎么回事 且看一: 这两个一个是标准C库的,定义了一些字符串的处理函数.一个是标准C++库的,定义了标准C++的std::string类

学习使用html与css,并尝试写php

这两天看了一点php,本想着实践一下,发现自己的服务器还没弄好,php的代码只写了两三行嵌在html中,还运行不了,同时还发现自己这几天学的html和css还不够,总是频频出现问题,学习的样式和布局都还太单一,一些知识也没掌握好,所以写出来的网页也只能呵呵呵了,尽管如此,但依然在努力中!下面的代码是两个html和一个css,运用了今天新学的窗口将另一个html嵌入在了窗口里,并试着用css进行了简单的样式设计,但仍然存在问题,图片的处理总是令我头疼.看不下去的也不要吐槽哦,我会加油的! <!DO

派遣例程与IRP结构

提到派遣例程,必须理解IRP(I/O Request Package),即"输入/输出请求包"这个重要数据结构的概念.Ring3通过DeviceIoControl等函数向驱动发出I/O请求后,在内核中由操作系统将其转化为IRP的数据结构,并"派遣"到对应驱动的派遣函数中,如图21.1.6所示. Ring3程序调用kernel32.dll导出的DeviceIoControl函数后,会调用到ntdll.dll导出的NtDeviceIoControlFile函数,进而调用

A tutorial on Principal Components Analysis | 主成分分析(PCA)教程

A tutorial on Principal Components Analysis 原著:Lindsay I Smith, A tutorial on Principal Components Analysis, February 26, 2002. 翻译:houchaoqun.时间:2017/01/18.出处:http://blog.csdn.net/houchaoqun_xmu  |  http://blog.csdn.net/Houchaoqun_XMU/article/details

BP神经网络基本原理

2.1 BP神经网络基本原理 BP网络模型处理信息的基本原理是:输入信号Xi通过中间节点(隐层点)作用于输出节点,经过非线形变换,产生输出信号Yk,网络训练的每一个样本包含输入向量X和期望输出量t,网络输出值Y与期望输出值t之间的偏差,通过调整输入节点与隐层节点的联接强度取值Wij和隐层节点与输出节点之间的联接强度Tjk以及阈值,使误差沿梯度方向下降,经过重复学习训练,确定与最小误差相相应的网络參数(权值和阈值),训练即告停止.此时经过训练的神经网络即能对相似样本的输入信息,自行处理输出误差最小

一个java程序员自学IOS开发之路(二)

2015/9/28 Day 8 最近工作上比较忙,加上虚拟机里mac把Xcode起来电脑就很卡了,更别提在虚拟机的mac系统里再开iPhone虚拟机了. 另外乘着中秋国庆好好休息下~过后准备大出血入手Macbook pro PS:同事居然在公司发的月饼里吃出来虫子= =,幸好我没打算吃,因为我讨厌月饼 2015/10/1 Day 9 开始学习OC内存管理 OC中的内存是要程序员来管的,因为并没有Java中的垃圾回收机制. 及时释放内存是我们要时刻考虑的,同时还是注意野指针 堆空间的对象需要手动代

字符识别OCR研究一(模板匹配&amp;amp;BP神经网络训练)

摘 要 在MATLAB环境下利用USB摄像头採集字符图像.读取一帧保存为图像.然后对读取保存的字符图像,灰度化.二值化,在此基础上做倾斜矫正.对矫正的图像进行滤波平滑处理,然后对字符区域进行提取切割出单个字符.识别方法一是採用模板匹配的方法逐个对字符与预先制作好的字符模板比較,假设结果小于某一阈值则结果就是模板上的字符:二是採用BP神经网络训练.通过训练好的net对待识别字符进行识别.最然后将识别结果通过MATLAB下的串口工具输出51单片机上用液晶显示出来. keyword: 倾斜矫正.字符切