3.8086中的栈操作(push、pop)、[BX]和loop

一、栈

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次

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值