第三章知识总结

3.1 内存中字的存储

一个字的大小为两个字节,8086CPU一个寄存器的大小为两个字节,所以使用8086CPU的寄存器存储一个字单元的时候,高字节寄存器存储字的高位字节,低字节寄存器存储字的低位字节。在用内存存储一个字的时候,高内存单元存储字的高字节,低内存单元存储字的低字节。小端法。比如20000(4E20H)在进行内存存储的时候,我们此时有0,1两个地址的内存单元,那么字的高字节4EH存储在内存地址为1的内存单元,字的低字节单元20H存储在内存地址为0的低内存单元。

字单元概念,即连续存储两个字节的内存单元。高内存单元存储字的高字节数据,低内存单元存储字的低字节数据。以后将起始地址为N的字节单元称为N地址字单元。

3.2 DS和[address],字的传送

CPU要读取一个内存单元的地址,必须得到该内存单元的段地址:偏移地址 才能得到实际的内存地址。

因为DS为段寄存器,8086CPU所以不能直接给段寄存器复制,必须通过普通寄存器过渡存储。8086CPU对于段地址默认取自DS寄存器。所以这样不仅有了段地址和偏移地址,我们就可以轻松取得内存的数据了,这里内存地址表示方式为[......],表示取得方框内为偏移地址的内存中的数据。

关于寄存器和内存之间传值,因为8086CPU在内存中有16根数据线,故一次性可以传送一个字的数据。

3.4 mov、add、sub指令,数据段

关于mov传值的形式:

mov 寄存器,数据        如:mov ax,8

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

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

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

mov 段寄存器,寄存器   如:mov DS,AX

mov 寄存器,段寄存     如:mov AX,DS

mov 内存单元,段寄存器 如:mov [0],DS

mov 段寄存器,内存单元 如:mov DS,[0]

add与sub指令的形式与mov类似,如下:

在8086CPU中我们可以把一段连续的内存地址作为数据段使用,该数据段用于存储数据。

3.5 栈结构及CPU提供的栈机制

栈为一种线性结构,这里我们可以理解为栈为一种先进后出的存储结构或者数据结构。举个例子,比如我们有三本书book1,book2和book3依次入栈。其结构及入栈出栈流程(略)

在8086CPU也提供了相关指令以栈的方式访问内存,在基于8086CPU编程的时候。可以将一段内存当做栈使用,8086CPU指令系统提供了PUSH和POP两个指令进行栈操作,PUSH为入栈操作,POP为出栈操作,入栈时将数据压栈,出栈的时候取出栈顶指向的数据。8086CPU的PUSH和POP操作都是以字为单位进行的。比如PUSH ax为将ax的数据压入栈空间,POP ax为将栈顶的数据弹出存入ax中。
下面将10000H-1000FH这段内存当成栈空间使用,其相关出栈入栈的流程如下图所示:

在8086CPU中有两个重要的寄存器,SS和SP,SS即Stack Segment,SP即Stack Point,代表着栈的段地址和栈顶地址。通过这两个地址CPU便可以识别栈空间和栈顶位置。

描述PUSH和POP指令的运行过程:

 

例如PUSH AX,由两步完成

(1) SP=SP-2;SS:SP指向当前栈顶前面的单元,以当前栈顶前面的单元为新的栈顶。

(2) 将AX送入SS:SP指向的内存单元处,SS:SP此时指向新的栈顶。

例如POP AX,由两步完成

(1) 将SS:SP指向的内存单元处的数据送入AX中。

(2) SP=SP+2,SS:SP指向当前栈顶的下面的单元,以当前栈顶下面的单元为新的栈顶。

3.6 栈顶越界的问题
从上面的描述已经介绍了SS和SP指向栈空间栈顶的位置,但是栈空间是有大小的,如果一直将数据压栈直到超过栈的空间那就会造成栈顶越界的问题,CPU是不会检查栈顶是否越界的问题,因为CPU并不知道当前栈空间的大小,所有在编程的时候需要程序员自己注意和控制栈顶越界的问题。

3.7 PUSH和POP的其他使用方式和栈段

PUSH和POP是对栈存储空间操作的特定指令,然而PUSH和POP不仅可以操作寄存器还可以对段寄存器和内存进行操作

比如 PUSH DS;

POP   DS;

PUSH [0];

POP  [0];

关于段,前面我们已经接触过好几个段寄存器,CS,DS,SS其中CS为code segment(代码段),DS为data segment(数据段),ss为stack segment(栈段),这三个段寄存器分别存储不同的数据。在需要的时候可以通过段地址+偏移地址取得各个段中的数据。

原文地址:https://www.cnblogs.com/skyen/p/9822286.html

时间: 2024-08-30 06:02:30

第三章知识总结的相关文章

汇编语言第三章知识梳理及思考

第三章 内存访问的角度学习寄存器 3.1内存中字的存储 0号单元是低地址单元,1号单元是高地址单元. 问题: (1)0地址单元(字节单元)中存放的字节型数据是多少?20H (2)0地址字单元中存放的字型数据是多少?4E20 (3)2地址字单元中存放的字节型数据是多少?12H (4)2地址单元中存放的字型数据是多少?0012H (5)1地址字单元中存放的字型数据是多少?124EH 结论:任何两个连续的内存单元,N号单元和N+1号单元,可以将它们看成一个地址为N的字单元中的高位字节单元N+1和低位字

第三章知识汇总

第三章   寄存器 3.1 内存中字的存储 CPU中,用16位的寄存器来存储一个字.高8位存放高位字节,低8位存放低位字节 字单元:存放一个字型数据(16位)的内存单元,由两个地址连续的内存单元组成.高地址内存单元中存放字型数据的高位字节,低地址内存单元中存放字型数据的低位字节. 3.2 DS和[address] DS寄存器:通常用来存放要访问数据的段地址 mov al [0]       [0]表示内存单元的偏移地址,8086CPU将自动使用此时DS的数据作为内存单元的段地址 8086CPU不

20165233 Java第二、三章学习总结

2017-2018-2 <Java程序设计>第二周学习总结 教材学习内容总结 第二.三章 ch2 标识符与关键字 基本数据类型: 逻辑类型:boolean 整数类型:int.byte.short.long(注意:long型常量用后缀L来表示:且Java中没有无符号声明) 字符类型:char 浮点类型:float.double(float常量后面必须有后缀f或F ) 类型转换运算 输入.输出数据 数组 ch3 运算符与表达式 if条件分支语句 switch开关语句 循环语句(包括for语句.wh

NodeJs&gt;-------&gt;&gt;第三章:Node.js基础知识

第三章:Node.js基础知识 一:Node.js中的控制台 1:console.log.console.info  方法 1 console.log("this is a test string."); 1 node app1.js 1> info.log 1 console.log("This is a test String ."); 2 3 //从第二个参数开始,依序输出所有的字符串 4 console.log("%s","

Python黑帽编程3.0 第三章 网络接口层攻击基础知识

3.0 第三章 网络接口层攻击基础知识 首先还是要提醒各位同学,在学习本章之前,请认真的学习TCP/IP体系结构的相关知识,本系列教程在这方面只会浅尝辄止. 本节简单概述下OSI七层模型和TCP/IP四层模型之间的对应关系,最后是本章教程需要的几个核心Python模块. 3.0.1 TCP/IP分层模型 国际标准化组织(ISO)在1978年提出了"开放系统互联参考模型",即著名的OSI/RM模型(Open System Interconnection/Reference Model).

知识图谱文献综述(第三章 实体识别与链接)

第三章 实体识别与链接 1. 任务定义.目标和研究意义 实体是文本中承载信息的重要语言单位,也是知识图谱的核心单元. 命名实体识别是指识别文本中的命名性实体,并将其划分到指定类别的任 务[Chinchor & Robinson, 1997].常用实体类别包括人名.地名.机构名.日期等. 实体链接主要解决实体名的歧义性和多样性问题,是指将文本中实体名指向其 所代表的真实世界实体的任务,也通常被称为实体消歧.例如,给 一句话“苹果发布了最新产品 iPhone X”,实体链接系统需要将文本中的“苹果”

【知识强化】第三章 栈和队列 3.1 栈

在第三章我们将继续学习三种非常重要的线性结构,分别是栈和队列的这样的受限线性表.我们将从它们的基本概念.存储结构以及相关应用这三方面进行详细的学习.最后我们将学习数组的相关知识,大家要注意一下这里的数组指的是一种线性结构,与我们之前在程序设计语言当中提到的数组类型是不同的概念.好,数组我们会学习它的定义以及它的存储结构,还有用数组来实现矩阵的压缩存储.最后还会提一个特殊的矩阵叫做稀疏矩阵.好,这就是本章所要学习的重要考点.本章所学习的知识点其实并不难,它常常出现在选择题当中,但是在之后我们解决一

构建之法前三章读后感

一. 软件作为一个产品,在提供用户使用前经历了许多工序,我们用工程的方式将开发软件的工序,过程加以工程化,系统化.成立了一套完整的体系后,有利于帮助我们开发软件,乃至于大型的系统. 软件具有一定的特殊性,使得软件工程师们做开发提升了一定的难度,但软件工程有助于软件系统的开发,帮助工程师们设计,构建,测试和维护软件.所以,软件工程的最终目的是帮助工程师们创造“足够好”的软件,提高软件的质量,用户满意度,可靠性,可维护性等. 第一章问题:怎么才算是一个真正的软件工程师? 二.   一个优秀的软件,通

0320 《构建之法》前三章观后感

第一章.为我们解释什么是软件,什么是软件工程,读完这章对这些概念有一定的认识这章让我明白,代码不能盲目的敲,好的软件并非两三天,并非一两个人就能赶出来的,需要大家的精诚合作.同时,在编写程序之前,还需要做一系列的分析.设计,要满足客户的需求,后续还要对软件进行测试.维护等.在这之前,我一直觉得能把程序运行,能有正确的结果,那就完成任务了,可这只是整个软件流程的一部分而已.看了邹老师的书,才知道其实创新有很多的方面,除了技术,还有商业思路,差异化等等,这些都给了我很大的感触,作为一名程序员,我们不