在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__
#ifdef __KERNEL__
#endif
static __inline__ __attribute_const__ __u32 ___arch__swab32(__u32 x)
{
#ifdef CONFIG_X86_BSWAP //如果定义了bswap指令,则直接执行该指令
__asm__("bswap %0" : "=r" (x) : "0" (x));
#else
__asm__("xchgb %b0,%h0\n\t"
"rorl $16,%0\n\t"
"xchgb %b0,%h0"
:"=q" (x)
: "0" (x));
#endif
return x;
}
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;
}
#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内嵌汇编之后,看其中的汇编的时候就不会那么吃力了。
<script type="text/javascript">
$(function () {
$('pre.prettyprint code').each(function () {
var lines = $(this).text().split('\n').length;
var $numbering = $('<ul/>').addClass('pre-numbering').hide();
$(this).addClass('has-numbering').parent().append($numbering);
for (i = 1; i <= lines; i++) {
$numbering.append($('<li/>').text(i));
};
$numbering.fadeIn(1700);
});
});
</script>
版权声明:本文为博主原创文章,未经博主允许不得转载。
分享到:
相关推荐
emmintrin.h和xmmintrin.h头文件 两个文件我找了半天,终于找到了,希望对开发软件的或做优化的朋友省点时间!
Host byte order to network byte order.doc(主机字节顺序转换成网络字节顺序)
VC (CString,char,int,long,string,byte...)名种类形间的转换
POCO C - Types and Byte Order Types for fixed-size integers, byte order conversions and the Any/DynamicAny types.
Algorithm-bytecount.zip,计算给定字节或utf-8字符在内存片中的出现次数–快速,算法是为计算机程序高效、彻底地完成任务而创建的一组详细的准则。
byteorder, 在大尾数和小尾数中,用于读取/写入数字的Rust 库 这个箱子提供了方便的方法编码和解码数字大的前端或者小结尾顺序。 在MIT或者 UNLICENSE 许可的双重许可。文档https://docs.rs/byteorder安装这个箱子与...
学习文档_JAVA中Integer和Byte转换
IEEE754与十进制转换
压缩文件包含ndt.h 和 ndt.hpp。 低版本PCL库(1.7.2之前)不包含ndt.h 和 ndt.hpp,有时却要用到。所以分享给朋友们。
OP alarm message block that locks alarms and swaps byte.zip西门子PLOP alarm message block that locks alarms and swaps byte.zip西门子PLOP alarm message block that locks alarms and swaps byte.zip西门子...
UART.h程序 可直接移植应用void UART_Init()void UART_Send_Byte(unsigned char mydata)void UART_Send_Str(char *s)void UART_Put_Inf(char *inf,unsigned long dat)
byte-buddy-agent-1.9.10.jar
串口模式 AVR 驱动 测试无问题亲...send_byte(date_math(x,y),command); for(a=nu;a>0;a--) { number2*=10; number2+=number; number/=10; } for(a=nu;a>0;a--) { send_byte(number2+'0',dater); number2/=10; } }
* DIBAPI.H * * Header file for Device-Independent Bitmap (DIB) API. Provides * function prototypes and constants for DIB functions *************************************************************...
用于编译class类文件,能够完成class文件的读取、修改功能.exe
ByteStream.jsByteStream类ByteStream类是所有其他类的主要类。 它为搜索模式和数据转换提供了许多有用的功能。 为尽可能快的数据处理进行了优化。 方法描述清除清除现有流fromArrayBuffer 从现有的“ ArrayBuffer”...
1.7 for python 2.* 1.92 for python 3.0
赠送jar包:byte-buddy-1.10.22.jar; 赠送原API文档:byte-buddy-1.10.22-javadoc.jar; 赠送源代码:byte-buddy-1.10.22-sources.jar; 赠送Maven依赖信息文件:byte-buddy-1.10.22.pom; 包含翻译后的API文档:...
像这样将其添加到您的Cargo.toml : [ dependencies ]byteorder = " 1 " 如果要增强现有的Read和Write特征,请导入扩展方法,如下所示: use byteorder :: {ReadBytesExt, WriteBytesExt, BigEndian, LittleEndian}...
赠送jar包:byte-buddy-1.10.20.jar; 赠送原API文档:byte-buddy-1.10.20-javadoc.jar; 赠送源代码:byte-buddy-1.10.20-sources.jar; 赠送Maven依赖信息文件:byte-buddy-1.10.20.pom; 包含翻译后的API文档:...