点击链接加入群【C语言】:http://jq.qq.com/?_wv=1027&k=2H9sgjG



好了,我们来讲一下栈这个东西。它是个什么东西呢?我们前面已经讲过了啊,你不会忘记了吧,是一块内存呀。如果你忘了,我 - -!

讲栈,要讲一些汇编知识喽,汇编,大神们都要掌握的东西呀,我们这些小菜菜们多少也了解一点吧,熟话说的好,艺多不压身嘛,如果你会木工、电工、钢斤工、焊工,那么你夏天应该不会去干焊工,其它三个 你可能还要考虑哪个给的钱多干哪个,这就是艺多不压身呀,再来,趁年轻应该多学几门手艺哦。

介绍几个我们用的着的指令就行了,我们不会关心太多细节,我们只讲它的功能即可

第一个 MOV A,B  就是将B的值 给A,简单吧,So Easy!如MOV EAX,10 就是EAX = 0X10

第二个 SUB A,B  就是将A的值 减掉B,如SUB EAX,10,就是EAX=EAX-0X10

第三个 LEA A,B  就是将B的地址给A,如LEA EDI,val 就是把val的首地址给EDI

第四个 rep stos dword ptr [edi] ,这个复杂一点,就是将EAX里面的值 ,循环写入 EDI 指向的地址里去,循环一次,ECX的值-1,ECX=0结束循环,EDI的值+4

第五个 PUSH A  就是先将ESP-4,然后将A写入ESP指向的位置,这个过程叫压栈或进栈

第六个 POP A  就是先将ESP指向的值写入到A,然后将ESP的值+4,这个过程叫弹栈或出栈

第七个 CALL FUN 就是调用函数,在这个操作进行的时候,要先将EIP的值压入堆栈

第八个 RET    就是返回指令,将栈中的数据弹到EIP中

好了,差不多已经够了,那么大家可能会有几个不明白的地方,如EAX,ECX,ESP,EIP 是什么意思,做什么用的?它们是寄存器,可以假想成是CPU的内存,其实还有许多寄存器,我们用的就是那么几个,可以点调试窗口中的 Register按钮来调出寄存器窗口 如图

C语言入门篇-06_C语言学习

我们来做一些简单介绍:EAX 主要是用来累加和用的,用于普通计算

EBX,ESI,EDI 保存函数环境用的,ESI,EDI还用于字符串指令,暂不介绍

ECX 主要用于循环计数用的

EDX 我也忘了是干什么用的了,通用

EIP 这个重要,始终指向将要执行的指令,由系统自动处理

ESP 始终指向栈顶

EBP 基址指针寄存器 EFL 标志寄存器

好了,就先介绍这么多,我以前对这些东西掌握的可是很到家的哦,,时间久了,忘了 - - !下面的其它的寄存器大家可以不用了解了,涉及到一些其它的指令集,如MMX呀,SSE什么什么的,下面还有 ST0 - ST7 是浮点运算用的寄存器,我们一般也不怎么涉及。


讲了那么多,我们来讲一下栈这个数据结构,栈是一块内存,我们把它们看成是 4个4个连续的内存空间,也就是说,如果 我们的栈是1KB,那么可以把它看成256个4B的整数空间,既然是内存块,那么就有高低地址之分,我们假设最高地址为 0X00131288,ESP 刚开始就指向这里,那么入栈是什么意思,就是先将ESP-4,那么ESP= 0X00131284,然后将要入栈的数据写入到 0X00131284 85 86 87 这四个地址里,再入栈就是再将ESP -4 = 0X00131280 ,然后将要入栈的数据写入到 0X00131280 81 82 83这四个地址里,明白了吧,就这样,栈是从大地址向着小地址伸长的,如果出栈呢,如POP EAX,就是先将80 81 82 83 这四个地址里的数据 写入到 EAX里,然后再把ESP+4 = 0X00131284,好了这就是栈啦。你需要把这段话多读几遍,自己随便指定一个ESP的值 ,然后用几个PUSH POP 指令做做实验。

好了,那么我们来看一下函数喽:代码如下

#include <stdio.h>
void swap(int a,int b)
{
    int tem = a;
    a = b;
    b = tem;
}
int main()
{
    int a =1;
    int b =2;
    swap(a,b); 
    return 0;
}

代码很简单的,由于这段比较难于理解,或者不好用文字来表述,我打算用视频来描述一下

下载地址如下:

本节视频下载地址

好了,这讲就到这里了,希望对你有帮助!。。。。大家一定要动手练习,这个看懂以后,你就会明白为什么我们的SWAP函数没有把值交换掉,我们再把代码稍微修改一下,看看是什么效果

#include <stdio.h>
void swap(int *pa,int *pb)
{
    int tem = *pa;
    *pa = *pb;
    *pb = tem;
}
int main()
{
    int a =1;
    int b =2;
    swap(&a,&b);   
    return 0;
}

这段代码需要大家自己研究,过程同我视频里的一样,如果你能自己搞懂,你就真的懂了,如果你不懂,那么你还要从01 到 06 再多看几遍。。。。。 - -!  88