汇编语言 手记8

栈有两个基本的操作:入栈和出栈

入栈:将一个新的元素放到栈顶

出栈:从栈顶取出一个元素

栈顶的元素总是最后入栈,需要出栈时,又最先被从栈中取出。

栈的操作规则:LIFO

8086CPU提供相关的指令来以栈的方式访问内存空间。

入栈出栈指令:

PUSH(入栈)POP(出栈)

push ax   将寄存器ax中的数据送入栈中;

pop ax   从栈顶取出数据送入ax

均是以为单位进行的。

字型数据用两个单元存放,高地址单元放高8位,低地址单元放低8位。

段寄存器SS 存放栈顶的段地址

寄存器SP 存放栈顶的偏移地址

任意时刻,SS:SP指向栈顶元素

push ax

1 sp=sp-2

2 将ax中的内容送入SS:SP指向的内存单元,SS:SP此时指向新栈顶。

当栈是空时,它指针会指向当前栈的最高地址的下一地址。

任意时刻,SS:SP指向栈顶元素,当栈为空的时候,栈中没有元素,也就不存在栈顶元素。

所以SS:SP只能指向栈的最底部单元下面的单元,该单元的偏移地址为栈最底部的字单元的偏移地址+2

栈最底部字单元的地址为1000:000E,所以栈空时,SP=0010H。

8086CPU的互作机理,只考虑当前的情况:

当前栈顶在何处

当前要执行的指令是哪一条。

将10000H-1000FH这段空间当作栈,初始状态是空的,将AX,BX,DS中的数据入栈

抹空操作

不用mov来实现写入操作

mov ax,1000H

mov ss,ax

mov sp,2

mov ax,2255H

push ax

push pop实质上就是一种内存传送指令,可以在寄存器和内存之间传送数据,与mov指令不同的是,push和pop指令访问的内存单元的地址不是在指令中给出的,而是由SS:SP指定的。

push pop和mov不同的是,mov只需要一步传送;而push pop指令却需要两步操作。

执行push时:先改变sp,后向ss:sp处传送

执行pop时:现读取ss:sp数据,后改变sp.

任何时刻ss:sp指向栈顶元素

8086只记录栈顶,占空间的大小要自己管理

如果内存从10000H-1FFFF,描述栈为空时:

任意时刻,SS:SP指向栈顶元素,当栈为空的时候,栈中没有元素,也就不存在栈顶元素,所以SS:SP只能指向栈的最底部单元下面的单元,该单元的偏移地址为栈最底部的字单元的偏移地址+2,栈最底部字单元的地址为1000:FFFE,所以栈空时,SP=0000H

CPU都是16为传送数据的,N<=64K.从栈操作指令所完成的功能的角度上来看,push pop等指令在执行的时候只修改SP.所以栈顶的变化范围是 0-FFFFH,从栈空时候的SP=0,一直压栈,直到栈满时SP=0;如果再次压栈,栈顶将环绕,覆盖了原来的内容。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏包子铺里聊IT

[mitbbs面经][Google] k largest elements

mitbbs google 最新算法题讲解,sliding window 中查找top K元素。 发题人id:zerocoolcode 发题时间: 3/25/2...

36540
来自专栏Java大联盟

23种设计模式详解(五)

14830
来自专栏Golang语言社区

动手实现一个JSON验证器(上)

分析 既然要验证JSON的有效性,那么必然需要清楚的知道JSON格式,这个在JSON官网已经给我们画出来了: ? ? ? ? ? 从官方的图上面可以看出,JSO...

53270
来自专栏日常分享

Java 循环队列的实现

  队列(Queue)是限定只能在一端插入、另一端删除的线性表。允许删除的一端叫做队头(front),允许插入的一端叫做队尾(rear),没有元素的队列称为“空...

25330
来自专栏Spark学习技巧

Flink DataSet编程指南-demo演示及注意事项

Flink中的DataStream程序是对数据流进行转换的常规程序(例如,过滤,更新状态,定义窗口,聚合)。数据流的最初的源可以从各种来源(例如,消息队列,套接...

4.5K120
来自专栏difcareer的技术笔记

JNI实现源码分析【四 函数调用】正文0x01:dvmCallMethodV0x02:nativeFunc0x03: 何时赋值

有了前面的铺垫,终于可以说说虚拟机是如何调用JNI方法的了。JNI方法,对应Java中的native方法,所以我们跟踪对Native方法的处理即可。

10940
来自专栏小樱的经验随笔

【Java数据结构学习笔记之三】Java数据结构与算法之队列(Queue)实现

  本篇是数据结构与算法的第三篇,本篇我们将来了解一下知识点: 队列的抽象数据类型 顺序队列的设计与实现 链式队列的设计与实现 队列应用的简单举例 优先队列的设...

41270
来自专栏PHP在线

PHP7新特性介绍

文内容根据PHP发布时的 new files 而来,链接地址 : PHP 7 new 特性一览 Added??operator Added <=> opera...

38260
来自专栏听雨堂

Execute 方法(Find 对象)

Execute 方法(Find 对象) 运行指定的查找操作。如果查找成功,则返回 True。 语法 expression.Execute(FindText, M...

20070
来自专栏JavaEdge

分析Java AtomicIntegerincrementAndGet方法缺点

63550

扫码关注云+社区

领取腾讯云代金券