从零开始学汇编

从零开始学汇编

5 (96人评价)
  • 课时:(62)

  • 学员:(2516)

  • 浏览:(147766)

  • 加入课程

第三章 寄存器(内存访问)07的笔记

相关课时: 笔记详情:

我们可以将长度为N(N《=64KB)的一组地址连续,起始地址为16的倍数的内存单元,当作栈来使用,从而定义了一个栈段。

将一段内存当作栈段,仅仅是我们在编程时的一种安排,CPU并不会由于这种安排,就在执行PUSH,POP等栈操作指令时就自动地将我们定义的栈段当作栈空间来访问。

将SS:SP指向我们定义的栈段。

在之前有一道例子:在1000H--1000FH这段空间当作栈段,初始状态是空的,此时,SS=1000H,SP=0010.

现在,如果我们将10000H-1FFFFH这段空间当作栈段,初始状态是空的,SS=1000H,则SP=?

分析:我们将10000H-1FFFFH这段空间当作栈段,SS=1000H,栈空间大小为64KB,栈最底部的字单元地址为1000:FFFE。

任意时刻,SS:SP指向栈顶,当栈中只有一个元素的时候,SS=1000H,SP=FFFE。

栈为空,就相当于栈中唯一的元素出栈,出栈后,SP=SP+2。

SP原来为FFFE,加2后SP=0,所以,当栈为空的时候,SS=1000H,SP=0.

 

一个栈段最大可以设为多少?

2的16次方=64KB

利用PUSH和POP都是利用SP操作的,SS是不变的,所以栈顶的变化范围是0-FFFFH,从栈空时候的SP=0,一直压栈,直到栈满时SP=0,如果再次压栈,栈顶将环绕,覆盖了原来栈中的内容。

 

一段内存,可以既是代码的存储空间,又是数据的存数空间,还可以是栈的空间,也可以什么都不是

关键在于CPU中寄存器的设置,即CS.IP.SS.SP.DS的指向

 

0 0