Chinaunix首页 | 论坛 | 博客
  • 博客访问: 249740
  • 博文数量: 65
  • 博客积分: 2758
  • 博客等级: 少校
  • 技术积分: 725
  • 用 户 组: 普通用户
  • 注册时间: 2006-02-25 00:23
文章分类

全部博文(65)

文章存档

2011年(4)

2010年(1)

2009年(60)

我的朋友

分类:

2009-11-19 15:26:55

作者:重楼
时间:2009-08-21
注明:本教程须自行操作方可真正理解
上次我们分析了 send  recv函数的实现
今天我们还是用那个模拟器 源代码分析下那个 CALL

模拟器界面:

 


加血按钮的 源代码:

 


下面的这个CALL 应该就是上面那个加血功能的 汇编代码了

 

对比下有什么相同之处


断在CALL的时候 堆栈的状况



 



好了 我们来分析下


 



子程序 发送封包  的源代码



 


我们进入到 CALL里面来对照一下


选中 call    0040A875    按回车  (或者 运行到此处 按 F7 步进)


 

呵呵 我们一点一点来分析 .


下面是 call    0040A875    里的 汇编代码




 




第一个CALL 是 a = 包头 + 数据
第三个CALL 是 客户.发送数据(a)



我们进到 第一个CALL里面  来看看 易语言是如何把2个封包数据组合在一起的




 



这章 我对比源代码 分析了 他的汇编代码的实现过程. 因为水平问题,可能与正确答案有所出入,如果有错误的地方请指出.

*汇编知识

esp是堆栈指针
ebp是基址指针

32位CPU所含有的寄存器有:

4个数据寄存器(EAX、EBX、ECX和EDX)
2个变址和指针寄存器(ESI和EDI) 2个指针寄存器(ESP和EBP)
6个段寄存器(ES、CS、SS、DS、FS和GS)
1个指令指针寄存器(EIP) 1个标志寄存器(EFlags)

寄存器AX和AL通常称为累加器(Accumulator),用累加器进行的操作可能需要更少时间。累加器可用于乘、除、输入/输出等操作,它们的使用频率很高;

寄存器BX称为基地址寄存器(Base Register)。它可作为存储器指针来使用;

寄存器CX称为计数寄存器(Count Register)。在循环和字符串操作时,要用它来控制循环次数;在位操作中,当移多位时,要用CL来指明移位的位数;

寄存器DX称为数据寄存器(Data Register)。在进行乘、除运算时,它可作为默认的操作数参与运算,也可用于存放I/O的端口地址。
阅读(2580) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~