汇编之堆栈

简单指令

  当我们看了寄存器的详解后,及了解算术中的变量,下面我们来看一下,在8086CPU中一些计算法则规则的讲解。

  先来看一下内存中字的存储、传送。

  字存储

  CPU中,用16位寄存器来存储一个字。高8位存放高位字节,低8位存放低位字节。由于内存单元是以字节单位,则一个字需要两个连续的内存单元来存放。字的高低位于内存单元高低地址单元对应。先前以了解到8086CPU中内存地址有段地址和偏移地址组成,CPU在读取内容时通过内存单元访问内容,所以8086CPU中有一个DS寄存器,通常用来存储要访问的数据段地址。

  例如:mov bx, 1000H         mov  ds,bx          mov al,[0]

  上例中mov 指令的作用为寄存器和内存之间进行字节型数据的传送,“[...]”表示一个内存单元,"[...]"中的0表示内存单元的偏移地址。当读取内容时CPU将自动取DS中的数据为内存单元的段地址。

  我们知道8086CPU不支持将数据直接送入段寄存器,例如:mov  ds,1000H。因此我们需要使用普通寄存器进行中转,以达到对DS的负责。

  由于8086CPU是16位结构,有16根数据线,所以,可以一次性传送16位的数据,也就是说可以一次性传送1个字。只要在mov 指令中给出16位的寄存器就可以进行16位数据的传送。

  指令集

  mov 寄存器,数据                         例如:mov ax,1000H

  mov 寄存器,寄存器                      例如:mov ax,bx

  mov 寄存器,内存单元                  例如:mov ax,[0]

  mov 内存单元,寄存器                  例如:mov [0],ax            从寄存器向内存单元传送数据

  mov 段寄存器,寄存器                  例如:mov ds,ax            从寄存器向段寄存器传送数据

  数据段

  此处的数据段与前面讲解的代码段意思相近,解释为将一组长度为N(N≤64KB)、地址连续、起始地址位16的倍数的内存单元当作专门存储数据的内存空间。

  栈段

  先来说一下栈,是一种特殊的访问方式的存储空间,特殊于遵从数据先进后出。8086CPU提供入栈和出栈指令,最基本的两个是PUSH(入栈)和POP(出栈)。例如:PUSH AX表示将寄存器AX中的数据送入栈中,POP AX表示从栈顶取出数据送入AX,操作单位为字节。

  数据、代码有DS、CS、IP三个寄存器,而栈段有SS、SP寄存器,任意时刻,SS:SP指向栈顶元素。PUSH和POP指令执行时,CPU从SS和SP中得到栈顶的地址。

  PUSH命令:执行时将寄存器中的内容放入当前栈顶单元的上方,成为新的栈顶元素。操作步骤:①SP=SP-2②将AX中的内容送入SS:SP指向的单元处,SS:SP此时指向新栈顶。

  POP命令:执行时从栈顶单元中取出数据,送入寄存器中。操作步骤:①将SS:SP指向的内存单元处的数据送入AX中,②SP=SP+2,SS:SP指向当前栈顶下面的单元,以当前栈顶下面的单元为新的栈顶。

  PUSH和POP指令的格式可以是如下形式:

  PUSH 寄存器/段寄存器/内存单元

  POP   寄存器/段寄存器/内存单元

  注意

  由于栈容量为16位,在执行PUSH指令后,栈顶超出栈空间是常见的情况。当然栈在没有数据的情况下,执行POP指令出栈,也会出项同样的事儿。所以在编程时要注意操作是否会超界。

  在大多数情况下,栈将作为临时存放数据的首选。

  代码段、数据段、栈段区别

  相同之处:将一段内存定义为一个段,用一个段地址指示段,用偏移地址访问段内的单元。

  不同之处:①数据段存放的是数据,使用DS:IP读取②代码段存放的是代码,使用CS:IP读取③栈段使用SS:SP读取

  发现说的有一点多了,希望通过这些讲解,使我们对简单指令相关的概念与用法有一个基础性的了解。

  多说无用,做才是王道。

转载于:https://my.oschina.net/heli/blog/1611050

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值