一、栈

1、栈是一种有特殊访问方式的存储空间,最后进去的数据最先出去,Last In First Out(LIFO).

2、8086CPU提供入栈(PUSH)和出栈(POP)的操作,栈段最大64KB。

3、8086中栈存放数据由高地址到低地址,且对于16位的数据,高地址存高8位,低地址存第8位。

4、栈顶的地址由SS:SP两个寄存器决定,SS是存放栈的段地址,SP是栈的偏移地址。SS:SP无论何时,均指向栈顶。

5、当栈为空时,SP指向栈空间中最高地址的下一地址:

栈空间为 0x10000H-0x1000fH、SS=0x1000H时

SP=10H

特别地,栈空间为 0x10000H-0x1ffffH、SS=0x1000H时

SP=0H

原因:栈为空时,指向最高地址+1,目前最高地址是ffffH,+1就是0。

6、pop操作后,内存空间中的数据并没有改变,改变的只是栈顶的指向(SS:SP)。也就是说pop操作后原来内存的数据还有,只有等到下次写入新的数据才会被覆盖。

7、栈中是否为空,不是看栈空间中是否有数据,而是看SS:SP的指向是否是栈空间最高地址的下一地址。

二、push、pop

1、push指令执行过程:

①首先SP-2。

②将数据移入到CS:SP指向的空间。

2、pop指令执行过程:

①首先将CS:SP指向的空间的数据移入到寄存器。

②SP+2。

3、mov指令只是一步操作,就是移动数据;而pop和push除了移动数据外,还要修改SP。

4、pop与push不同的是,其访问的地址不在指令中,而是由SS:SP指出

5、pop和push可以直接对段寄存器操作

pop cs

pop ss

以上都是合法的

三、栈顶越界问题

上面说到,每次执行pop或者push指令时,都会对SP进行加减,而8086CPU中的关于栈的寄存器只有SS和SP,SS:SP永远指向栈顶,没有相应的栈空间范围的寄存器来限制SP的增加与减小。因此如果过分使用pop和push指令时,SS:SP是可能超出我们预想的栈的空间的。所以在编程时要自己操心栈顶超界的问题,根据可能用到的最大栈空间来安排站的大小,即要防止入栈超界,也要防止出栈超界。

PS:如果栈空间预设的是64KB,那么其他段的数据就会安全,因为pop和push只改变SP,无论怎么加减,它的范围都是0-FFFFH,都在SS指向的段地址开始64K的范围内,push或者pop多了,也仅仅是栈自己的数据乱掉了,不会打扰到其他段的数据。

四、[BX]和loop

1、[BX]是为了在对以DS为段地址的情况下,灵活访问内存空间而设立的,其本质与[0]相同,即DS:[BX]是访问以DS为段地址、BX中的数据为偏移地址的内存空间。需要注意的是,只能使用BX寄存器,换做AX、CX等是错误的

2、loop是循环,使用方法:

mov ax,2

mov cx,11 #cx设置为多少,循环多少次

s:add ax,ax

loop s

循环过程:

①首先无条件执行一次循环体。

②执行到loop后,首先先将cx-1,若cx不为0,则回到标号处执行;若为0,则执行下面的语句。

注意:当cx一开始设置成0时,要循环2^16次


传奇世界逆魔大殿怎么走
民间最有效的99种招财方法一览 你掌握了多少招财秘籍