因为自己在系统内核写网络程序有时候需要调用htons htonl 这样的函数进行转换,但由于内核只能调用c运行库,别的API不能调用。自己也接触过一点汇编,从来没有去学过。看过老码识途这本书前几章,如是自己反编译试了一下,结果自己还真反出来,对于懂汇编的人确实非常容易。

  1. ULONG myHtonl(ULONG i)
  2. {
  3. ULONG eax,edx,ecx;
  4. eax = i;
  5. edx = i;
  6. edx = edx << 16;
  7. eax = eax & 0x0ff00;
  8. eax = eax | edx;
  9. edx = i;
  10. edx = edx & 0x0ff0000;
  11. ecx = i >> 16;
  12. edx = edx | ecx;
  13. eax = eax << 8;
  14. edx = edx >> 8;
  15. eax = eax | edx;
  16. return eax;
  17. }

 变量就用寄存器的名字,这样避免混淆。 自己感觉这个代码是不是有点问题,他怎么没有判断自己系统是不是小端就进行转换了,如果自己电脑是高端怎么办呢?

后面看了网上一个人写模拟代码。

http://wxxweb.blog.163.com/blog/static/13512690020103145256909/

  1. ypedef unsigned short int uint16;
  2.  
  3. typedef unsigned long int uint32;
  4.  
  5. // 短整型大小端互换
  6.  
  7. #define BigLittleSwap16(A) ((((uint16)(A) & 0xff00) >> 8) | \
  8.  
  9. (((uint16)(A) & 0x00ff) << 8))
  10.  
  11. // 长整型大小端互换
  12.  
  13. #define BigLittleSwap32(A) ((((uint32)(A) & 0xff000000) >> 24) | \
  14.  
  15. (((uint32)(A) & 0x00ff0000) >> 8) | \
  16.  
  17. (((uint32)(A) & 0x0000ff00) << 8) | \
  18.  
  19. (((uint32)(A) & 0x000000ff) << 24))
  20.  
  21. // 本机大端返回1,小端返回0
  22.  
  23. int checkCPUendian()
  24.  
  25. {
  26.  
  27. union{
  28.  
  29. unsigned long int i;
  30.  
  31. unsigned char s[4];
  32.  
  33. }c;
  34.  
  35. c.i = 0x12345678;
  36.  
  37. return (0x12 == c.s[0]);
  38.  
  39. }
  40.  
  41. // 模拟htonl函数,本机字节序转网络字节序
  42.  
  43. unsigned long int HtoNl(unsigned long int h)
  44.  
  45. {
  46.  
  47. // 若本机为大端,与网络字节序同,直接返回
  48.  
  49. // 若本机为小端,转换成大端再返回
  50.  
  51. return checkCPUendian() ? h : BigLittleSwap32(h);
  52.  
  53. }
  54.  
  55. // 模拟ntohl函数,网络字节序转本机字节序
  56.  
  57. unsigned long int NtoHl(unsigned long int n)
  58.  
  59. {
  60.  
  61. // 若本机为大端,与网络字节序同,直接返回
  62.  
  63. // 若本机为小端,网络数据转换成小端再返回
  64.  
  65. return checkCPUendian() ? n : BigLittleSwap32(n);
  66.  
  67. }
  68.  
  69. // 模拟htons函数,本机字节序转网络字节序
  70.  
  71. unsigned short int HtoNs(unsigned short int h)
  72.  
  73. {
  74.  
  75. // 若本机为大端,与网络字节序同,直接返回
  76.  
  77. // 若本机为小端,转换成大端再返回
  78.  
  79. return checkCPUendian() ? h : BigLittleSwap16(h);
  80.  
  81. }
  82.  
  83. // 模拟ntohs函数,网络字节序转本机字节序
  84.  
  85. unsigned short int NtoHs(unsigned short int n)
  86.  
  87. {
  88.  
  89. // 若本机为大端,与网络字节序同,直接返回
  90.  
  91. // 若本机为小端,网络数据转换成小端再返回
  92.  
  93. return checkCPUendian() ? n : BigLittleSwap16(n);
  94.  
  95. }

  看了他自己添加了判断,我估计windows系统估计通过宏进行替换了honts 这些函数,如果是小端 定义转换内容,如是高端高端就定义直接返回即可了。这种做法windows最喜欢这样写代码了。

反汇编windows htonl()函数的更多相关文章

  1. 详解C语言的htons和htonl函数、大尾端、小尾端

    在Linux和Windows网络编程时需要用到htons和htonl函数,用来将主机字节顺序转换为网络字节顺序. 在Intel机器下,执行以下程序 int main(){   printf(" ...

  2. windows socket函数详解

    windows socket函数详解 近期一直用第三方库写网络编程,反倒是遗忘了网络编程最底层的知识.因而产生了整理Winsock函数库的想法.以下知识点均来源于MSDN,本人只做翻译工作.虽然很多前 ...

  3. Windows API 函数列表 附帮助手册

    所有Windows API函数列表,为了方便查询,也为了大家查找,所以整理一下贡献出来了. 帮助手册:700多个Windows API的函数手册 免费下载 API之网络函数 API之消息函数 API之 ...

  4. C#调用Windows API函数截图

    界面如下: 下面放了一个PictureBox 首先是声明函数: //这里是调用 Windows API函数来进行截图 //首先导入库文件 [System.Runtime.InteropServices ...

  5. 用Windows API函数(CreateFile/ReadFile/WriteFile/CloseHandle)完成文件拷贝程序(初级版)

    文件拷贝程序 程序类型:Console 参数:源文件名   目的文件名 要求:1.只能使用Windows API函数(CreateFile/ReadFile/WriteFile/CloseHandle ...

  6. htons和htonl函数具体应用

    htons和htonl函数具体应用 htons和htonl函数,是用来将主机字节顺序转换为网络字节顺序在进行网络抓包时,抓到的包的数据是网络字节顺序,在进行编程时,要进行主机字节顺序和网络字节顺序间的 ...

  7. Windows API函数大全(完整)

    Windows API函数大全,从事软件开发的朋友可以参考下 1. API之网络函数 WNetAddConnection 创建同一个网络资源的永久性连接 WNetAddConnection2 创建同一 ...

  8. MFC中调用Windows API函数的方式

    windows aoi 函数的调用前面加::

  9. VBS调用Windows API函数

    Demon's Blog 忘记了,喜欢一个人的感觉 Demon's Blog  »  程序设计  »  VBS调用Windows API函数 « 用VBS修改Windows用户密码 在VB中创建和使用 ...

随机推荐

  1. iso定制封装

    http://xiaoli110.blog.51cto.com/1724/1617541

  2. TCP/IP 相关总结

    1.   三次握手协议 在TCP/IP协议中,TCP协议提供可靠的连接服务,采用三次握手建立一个连接. 第一次握手:建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等 ...

  3. [iOS基础控件 - 6.7] 微博展示 使用代码自定义TableCell(动态尺寸)

    A.需求 1.类似于微博内容的展示 2.头像 3.名字 4.会员标志 5.内容 6.分割线 7.配图(可选,可有可无)   code source: https://github.com/hellov ...

  4. yii2 i18n学习

    举例说明常见的翻译:Yii::t('app','Login'):追踪源码:BaseYii.php 文件 ,Yii::t($category, $message, $params = [], $lang ...

  5. 关于AS3里的Matrix3D中的appendXXX和prependXXX

    最近在看3D相关的一些基础,因为搞as3这么多年了,决定3D基础这块还是从AS3入手,3D游戏开发这块从U3D入手,扯远了,研究Matrix3D类时发现了矩阵处理转换时的一些方法均分为appendXX ...

  6. SQLite使用教程11 表达式

    SQLite 表达式 表达式是一个或多个值.运算符和计算值的SQL函数的组合. SQL 表达式与公式类似,都写在查询语言中.您还可以使用特定的数据集来查询数据库. 语法 假设 SELECT 语句的基本 ...

  7. action 带参数跳转

    都容易忘记 <result name="goOpPolicy" type="redirect">queryPolicy.action?aaaa=${ ...

  8. 2015北京网络赛 J Clarke and puzzle 求五维偏序 分块+bitset

    Clarke and puzzle Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://hihocoder.com/contest/acmicpc20 ...

  9. 产生不重复的随机数TGUID

    uses ActiveX; procedure TForm1.BtnNewClick(Sender: TObject);var  ID: TGUID;  S: string;begin  if CoC ...

  10. Twenty Newsgroups Classification任务之二seq2sparse(3)

    接上篇,如果想对上篇的问题进行测试其实可以简单的编写下面的代码: package mahout.fansy.test.bayes.write; import java.io.IOException; ...