作者:重楼 时间: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) |