《汇编语言》学习笔记7——堆栈

1.地址:分为物理地址、逻辑地址

  1.物理地址:内存单元的真实地址

  2.逻辑地址:用于编程的地址。8086CPU采用用两个16位的地址通过地址加法器合成一个20位的地址通过地址总线传到存储器

    分为:段地址、偏移地址。其中段地址*16就是人为划分的段的起始地址,偏移地址是在这个段中通过段地址要走多少长度才能找到你要找的位置

  逻辑地址的形式:段地址:偏移地址

2.逻辑地址转换为物理地址:  物理地址  =  段地址*10H(16)  +  偏移地址

  分析:转换时先将段地址左移4位,相当于乘以16或16进制的10H,再加上偏移量、其中移位后的地址就是在段地址后加一个0(如:段地址:2000H  则段地址*10H就是20000H)

3.存储单元

  1.一个字节=8位二进制,1个字=2个字节

  2.存储单元中的数据为存储单元内容,用括号括起来表示,不括起来的表示地址

  3.存储单元分为:欧地址单元、奇地址单元

      一般的,字放在偶地址单元,字节可随意

4.分段:只是人为的分段,而不是内存进行了分段

  1.一个段的起始地址必是16的倍数,每段最大为64K字节单元,最少为16个字节单元。段内单元的地址可用16位二进制数表示,成为偏移地址,每段的偏移地址可从0000H~FFFFH。段地址也是16位,用于表示哪一个段,用段地址和偏移地址可确定一个逻辑地址。

  2.规定:16个字节分为一小段,每个小段的第一个单元的物理地址为小段的首地址。存储分段时,各段的起始地址不必须是小段的首地址,即逻辑段必须从任一小段的首单元开始。

  3.CPU可以可用不同的段地址和偏移地址形成同一个物理地址

  4.给定一个段地址,仅通过偏移地址(16位)寻址,最多可寻64个存储单元

  5.说地址时的两种说法:1.数据存在2000:1F60中。2.数据存放在2000段的1F60单元中。

5.段的类型

  1.逻辑段分为:代码段、数据段、附加段、堆栈段

    代码段    用于存放指令,段地址存放在段寄存器CS

    数据段    用于存放数据,段地址存放在段寄存器DS

    附加段    用于辅助存放数据,段地址存放在段寄存器ES

    堆栈段    重要的数据结构,用来保存数据、地址和系统参数,段地址存放在段寄存器SS

    数据段和附加段的偏移地址也称为有效地址EA

6.CS和IP

  1.CS为代码段寄存器,IP为指令指针寄存器,通过两者指示要读取指令的地址。

    任意时刻CPU将CS:IP指向的内容当做指令执行。

    

  2.8086CPU工作过程:

    1.从CS:IP指向内存单元读取指令,读取的指令进入指令缓冲器

    2.IP=IP+所读取指令的长度,从而指向吓一条指令

    3.执行指令,转到步骤1,重复执行。

  3.8086CPU加电或复位后(即CPU刚开始工作时)CS和IP被设为CS=F000H,IP=FFFFH。即8086PC机刚启动时从FFFF0H单元读取指令,FFFF0H单元指令是8086PC机开机执行的第一条指令。

7.修改CS、IP的指令

    1.在CPU中能通过指令读写的部件只有寄存器。

    2.MOV指令称为传送指令,但不能用于设置CS、IP的值。

    3.能修改CS、IP的内容的指令称为转移指令。如:JMP指令

        JMP 段地址:偏移地址    用于指令中给出的段地址修改CS,偏移地址修改IP。

        若指向修改IP,可用指令:JMP    寄存器(合法的)  用寄存器的值修改IP

8.代码段

    1.定义代码段,将代码分到代码段,CPU就会把代码当指令来执行,而是必须要将CS:IP指向所定义的代码段中的第一条指令的首地址。

9.字在存放时,高字节(一个字的前八位)放在高地址(地址值大),低字节放在低地址。(即高对高、低对低)

10.DS寄存器:通常用来访问存放要访问数据的段地址

  MOV了完成两个传送:1.将数据直接送到寄存器。2.将一个寄存器中的内容送入到另一个寄存器。

  不能将数据直接送入寄存器中,可通过一个一个寄存器转换到其中。如:MOV BX 1000H   MOV DS,BX

      

11.堆栈

  1.堆栈区是一个特殊的存储区,末单元为栈底,数据从栈底开始存放,最后存放的数据单元为栈顶。当堆栈去为空时,栈顶和栈底重合。

  2.数据在在堆栈去存放时,必须以字存入,每存入一个字,后存入的数据依次放入栈的低地址单元中。

  3.栈指针SP每次减2,由栈指针SP指出当前栈顶的位置,数据存取时采用后进先出

  4.用SS表示栈的段地址,用SP表示偏移地址。

  5.注意栈顶超界的问题。

  6.PUSH执行步骤:1.先改变SP,后想SS:SP处传送

  7.POP执行步骤:1.先读取SS:SP处的数据,后改变SP。      

    

  8.任意时刻,SS:SP指向栈顶元素。当栈为空时,SS:SP指向栈底单元的下面的单元。

  9.栈地址总是从高地址向低地址发展。

  10.PUSH、POP只是修改了SP。

  11.8086的栈操作机制:SS、SP指示栈顶,改变SP后写入内存的入栈指令,读内存后改变SP的出栈指令

    

posted @ 2016-04-09 12:02  Sayer  阅读(3622)  评论(0编辑  收藏  举报