汇编学习-寄存器(内存访问)&栈机制

8086CPU中除了常见的AX,BX,CX,DX等4个通用寄存器外,还存在着其他不同类型的寄存器,如存储代码段地址的CS,以及代码段偏移地址的IP等。

这里先解释DS(存放数据段地址的寄存器)。8086CPU默认的将DS寄存器中存放的数据为内存单元的段地址。

8086CPU不允许直接对段地址进行赋值操作,因此如果想制定访问的内存地址,在设置段地址DS时,可以先将地址数据mov到AX中,然后再mov DS,AX。

而要设置内存中的地址偏移量时,可以直接使用mov [...]的方法,这里默认使用DS中的数据为段地址。例如mov [0],0010,对应的内存地址为DS * 16 + 0010


8086CPU提供栈的访问机制,利用SS寄存器存放栈的段地址,SP寄存器存放栈的偏移地址(或者将SP叫做栈内指针)

8086CPU提供push入栈操作和pop出栈操作,每次操作都是以字为单位进行的,也就是SP的移动量为+或者-2 。

栈是一种从高地址区向低地址区扩展的结构类型,其中SS * 16 + SP称为栈顶地址,栈顶地址中没有存放数据(可以这么理解)

假如目前SS = 1000,SP = 0010,栈顶地址为10010,push AX(AX = 1020),则地址10010中存放的是AX的高8位内容10,地址1000F中存放的是AX的低8位内容20。

即push操作后,SP = SP -2,pop操作后,SP = SP +2。

不过比较坑的是8086CPU并没有提供栈的越界提示,也就是说编程时要自己操心栈顶越界的问题(或者说栈的空间大小要我们自己去管理)。

如果将10000H到1FFFFH这段空间作为栈段的话,初始状态下栈是空的,那么显然SS = 1000,SP = ?

由于栈底字单元地址为FFFE,当最底的元素弹出栈后,SP = SP + 2,则SP = 0000。这里不考虑进位或者正负条件。


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值