天天看点

汇编语言学习笔记(3)

 35.栈:先进后出,涉及到入栈(PUSH)和出栈(POP)两个概念.

          a)push  ax   //表示将ax中的数据送入栈中

          b)pop    ax   //表示从栈顶取出数据送入ax

36.8086CPU的入栈和出栈操作都是以字为单位进行的.那么如何知道哪一段被当作栈在使用..?----How...?

      PUSH和POP时,需要知道栈顶元素..?----How...?

和CS:IP类似,在8086CPU中,有两个寄存器SS和寄存器SP,栈顶的段地址存放在ss中,偏移地址在sp中.

37.任意时刻,ss:sp指向栈顶元素 .PUSH和POP时,CPU从SS和SP中得到栈顶地址.

38.栈顶超界:和C语言中指针越界一样,是很危险的操作,这个需要程序员自己控制.

39.PUSH和POP指令:PUSH和POP可以是如下格式的:

         a)PUSH     寄存器 

         b)POP       寄存器      //将寄存器中的数据入栈或者将栈顶元素送到寄存器中

         c)PUSH    段寄存器

         d)POP     段寄存器     //同上

         e)PUSH     内存单元

         f)POP        内存单元     //同上

40.执行指令时,CPU要知道内存单元的地址,可以在PUSH,POP指令中只给出内存单元的偏移地址,段地址在执行指令时,从SS处获得.

     设置栈的大小:

                          mov   ax,1000H

                          mov   ss,ax

                          mov   sp,0010H                  //ss和sp的差值就是栈的大小了,由程序员自己控制

41.PUSH和POP与mov的区别是:两次操作和一个操作的关系.

42.栈段:被定义当作栈的一段连续的地址空间.----Where...?设置SS和SP的值.

43.关于段的结论:可以将一段内存定义为一个段,用一个段地址指示段,用偏移地址访问段的内存单元.-->自己设置.

        用一个段存放数据,称为数据段;

        用一个段存放代码,称为代码段;

        用一个段存放栈,称为栈段.

对于数据段,段的地址存放在DS中,用mov,add,sub等访问内存单元的指令时,CPU就是将我们定义的数据段中的内容当数据来访问;

对于代码段,段的地址存放在CS中,将第一条指令的偏移地址放在IP中,CPU就会执行我们定义的代码段中的指令;

对于栈段,段的地址放在SS中,将栈顶单元的偏移地址放在SP中,这样CPU在进行栈操作时,就将我们定义的栈段当栈空间来使用.

44.因此,一段内存是什么区域,扮演什么角色,关键在于CPU中寄存器的设置,即CS,IP,SS,SP,DS的指向.