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

模拟器界面

  


加血按钮的 源代码

  


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

  

对比下有什么相同之处 


断在CALL的时候 堆栈的状况 



  



好了 我们来分析下 


  



子程序 发送封包  的源代码 



  


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


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


  

呵呵 我们一点一点来分析 


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




  




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



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




  



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

*汇编知识 

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

32CPU所含有的寄存器有: 

4个数据寄存器(EAXEBXECXEDX) 
2个变址和指针寄存器(ESIEDI) 2个指针寄存器(ESPEBP) 
6个段寄存器(ESCSSSDSFSGS) 
1个指令指针寄存器(EIP) 1个标志寄存器(EFlags) 

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

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

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

寄存器DX称为数据寄存器(Data Register)。在进行乘、除运算时,它可作为默认的操作数参与运算,也可用于存放I/O的端口地址。

posted on 2011-10-17 12:01  巅枫  阅读(1513)  评论(0编辑  收藏  举报