因为自己在系统内核写网络程序有时候需要调用htons htonl 这样的函数进行转换,但由于内核只能调用c运行库,别的API不能调用。自己也接触过一点汇编,从来没有去学过。看过老码识途这本书前几章,如是自己反编译试了一下,结果自己还真反出来,对于懂汇编的人确实非常容易。
ULONG myHtonl(ULONG i)
{
ULONG eax,edx,ecx;
eax = i;
edx = i;
edx = edx << 16;
eax = eax & 0x0ff00;
eax = eax | edx;
edx = i;
edx = edx & 0x0ff0000;
ecx = i >> 16;
edx = edx | ecx;
eax = eax << 8;
edx = edx >> 8;
eax = eax | edx;
return eax;
}
变量就用寄存器的名字,这样避免混淆。 自己感觉这个代码是不是有点问题,他怎么没有判断自己系统是不是小端就进行转换了,如果自己电脑是高端怎么办呢?
后面看了网上一个人写模拟代码。
http://wxxweb.blog.163.com/blog/static/13512690020103145256909/
ypedef unsigned short int uint16; typedef unsigned long int uint32; // 短整型大小端互换 #define BigLittleSwap16(A) ((((uint16)(A) & 0xff00) >> 8) | \ (((uint16)(A) & 0x00ff) << 8)) // 长整型大小端互换 #define BigLittleSwap32(A) ((((uint32)(A) & 0xff000000) >> 24) | \ (((uint32)(A) & 0x00ff0000) >> 8) | \ (((uint32)(A) & 0x0000ff00) << 8) | \ (((uint32)(A) & 0x000000ff) << 24)) // 本机大端返回1,小端返回0 int checkCPUendian() { union{ unsigned long int i; unsigned char s[4]; }c; c.i = 0x12345678; return (0x12 == c.s[0]); } // 模拟htonl函数,本机字节序转网络字节序 unsigned long int HtoNl(unsigned long int h) { // 若本机为大端,与网络字节序同,直接返回 // 若本机为小端,转换成大端再返回 return checkCPUendian() ? h : BigLittleSwap32(h); } // 模拟ntohl函数,网络字节序转本机字节序 unsigned long int NtoHl(unsigned long int n) { // 若本机为大端,与网络字节序同,直接返回 // 若本机为小端,网络数据转换成小端再返回 return checkCPUendian() ? n : BigLittleSwap32(n); } // 模拟htons函数,本机字节序转网络字节序 unsigned short int HtoNs(unsigned short int h) { // 若本机为大端,与网络字节序同,直接返回 // 若本机为小端,转换成大端再返回 return checkCPUendian() ? h : BigLittleSwap16(h); } // 模拟ntohs函数,网络字节序转本机字节序 unsigned short int NtoHs(unsigned short int n) { // 若本机为大端,与网络字节序同,直接返回 // 若本机为小端,网络数据转换成小端再返回 return checkCPUendian() ? n : BigLittleSwap16(n); }
看了他自己添加了判断,我估计windows系统估计通过宏进行替换了honts 这些函数,如果是小端 定义转换内容,如是高端高端就定义直接返回即可了。这种做法windows最喜欢这样写代码了。
反汇编windows htonl()函数的更多相关文章
-
详解C语言的htons和htonl函数、大尾端、小尾端
在Linux和Windows网络编程时需要用到htons和htonl函数,用来将主机字节顺序转换为网络字节顺序. 在Intel机器下,执行以下程序 int main(){ printf(" ...
-
windows socket函数详解
windows socket函数详解 近期一直用第三方库写网络编程,反倒是遗忘了网络编程最底层的知识.因而产生了整理Winsock函数库的想法.以下知识点均来源于MSDN,本人只做翻译工作.虽然很多前 ...
-
Windows API 函数列表 附帮助手册
所有Windows API函数列表,为了方便查询,也为了大家查找,所以整理一下贡献出来了. 帮助手册:700多个Windows API的函数手册 免费下载 API之网络函数 API之消息函数 API之 ...
-
C#调用Windows API函数截图
界面如下: 下面放了一个PictureBox 首先是声明函数: //这里是调用 Windows API函数来进行截图 //首先导入库文件 [System.Runtime.InteropServices ...
-
用Windows API函数(CreateFile/ReadFile/WriteFile/CloseHandle)完成文件拷贝程序(初级版)
文件拷贝程序 程序类型:Console 参数:源文件名 目的文件名 要求:1.只能使用Windows API函数(CreateFile/ReadFile/WriteFile/CloseHandle ...
-
htons和htonl函数具体应用
htons和htonl函数具体应用 htons和htonl函数,是用来将主机字节顺序转换为网络字节顺序在进行网络抓包时,抓到的包的数据是网络字节顺序,在进行编程时,要进行主机字节顺序和网络字节顺序间的 ...
-
Windows API函数大全(完整)
Windows API函数大全,从事软件开发的朋友可以参考下 1. API之网络函数 WNetAddConnection 创建同一个网络资源的永久性连接 WNetAddConnection2 创建同一 ...
-
MFC中调用Windows API函数的方式
windows aoi 函数的调用前面加::
-
VBS调用Windows API函数
Demon's Blog 忘记了,喜欢一个人的感觉 Demon's Blog » 程序设计 » VBS调用Windows API函数 « 用VBS修改Windows用户密码 在VB中创建和使用 ...
随机推荐
-
js 的强制 类型 转换cast, 伪对象?
拼音输入法简单快捷, 但是重码多, 所以要看清了再选择, 不然会影响输入正确性和 心情的! js的类型 隐式 转换? 是指, 根据 表达式的操作符号 如if(), + , && , j ...
-
Web Service和WCF的到底有什么区别
[1]Web Service:严格来说是行业标准,也就是Web Service 规范,也称作WS-*规范,既不是框架,也不是技术. 它有一套完成的规范体系标准,而且在持续不断的更新完善中. 它使用XM ...
-
[转]ASP.NET中的forms验证
本文转自:http://www.cnblogs.com/fengzheng126/archive/2012/04/06/2435513.html ASP.NET的安全认证:Windows验证 (默认) ...
-
在Html中使用JavaScript的几点小结
前言 越发的意识到JS这门作为前端语言的重要性.所以下定决心这段时间在项目允许的情况下花大量时间在学习JS上.争取让自己的前端功底深厚一点. 小结 在包含外部js文件时,必须将src属性设置为指向相应 ...
-
【Linux】鸟哥的Linux私房菜基础学习篇整理(一)
最近,一直在写PPC的模拟器和汇编器,也在做设计.所以重新看了看<鸟哥的Linux私房菜>,还是有好多命令不太熟悉.就打算写几篇blog记下来. 1. nl [-bnw] filename ...
-
Docker 命令(二)
Docker 入门 启动docker systemctl start docker 帮助命令 docker --help docker [Commands] --help 例:docker run ...
-
在js中实现新窗口打开页面
我们都知道可以在html代码中使用<a href="xxxx" target="_blank"></a>这种方式来打开一个新的窗口打开一 ...
-
SpringBoot设置文件上传大小限制--默认为1M
SpringBoot默认上传文件大小不能超过1MB,超过之后会报以下异常:org.apache.tomcat.util.http.fileupload.FileUploadBase$FileSizeL ...
-
复习python
1当命令行键入python a.py的方式运行python程序时候,a.py不需要执行权,当已./a.py运行时,需要执行权 2.与c语言不同的地方 i = 3 print (i)#合法 #在pyth ...
-
SQL、HQL、JPQL、CQL的对比
SQL:全称结构化查询语言(Structured Query Language),是一种特殊目的的编程语言,是一种数据库查询和程序设计语言,用于存取数据以及查询.更新和管理关系数据库系统:同时也是数据 ...