第三章 寄存器(内存访问)

在第五章的学习之后,因为实验课在老师的抽查之后发现前面的知识很多都忘了,便对之前的知识进行了一遍系统的复习,对汇编的基础知识基本都已经掌握,也有了更加深刻的认识。

在第三章中我们主要从内存访问的角度来继续学习CPU执行指令的原理,并进一步的学习上一章的寄存器。

<1>内存中字的存储

字由高位字节和低位字节组成,用16位寄存器来存储。高八位存放高位字节,低八位存放低位字节。字需要两个地址连续的内存单元(一个字节)来存储,字的低位字节存放在低地址单元中,高位字节存放在高地址单元中。如下图,我们想要存放数据20000(4E20H)在0、1两个内存单元中,0号单元为低地址空间,1号单元为高地址单元,所以1号单元中存放高位字节4EH,0号单元中存放低位字节20H。(小尾顺序)

字单元:存放一个字型数据的内存单元,由两个地址连续的内存单元组成。高地址内存单元中存放字型数据的高位字节,低地址内存单元中存放字型数据的低位字节。我们可以将起始地址为N的字单元简称为N地址字单元。

<2>DS和[address]

CPU如果要想读写一个内存单元,必须有这个内存单元的地址。在8086PC中,内存地址是由段地址和偏移地址共同组成的。DS寄存器就是通常用来存放所要访问数据的段地址的。比如我们想要读取10000H内存单元的内容,可以使用如下的程序段去实现:(1)mov bx,1000H(2)mov ds,bx(3)mov al,[0]    第一条语句是吧所要访问的内存单元的段地址暂存在寄存器bx中,第二条语句是把寄存器bx中所存的1000H存入段寄存器ds中。之前我们使用“mov   ax,1”语句来实现把数据送入寄存器,而8086CPU不支持将数据直接送入段寄存器的操作,所以我们使用一个寄存求进行中转从而完成将数据送入段寄存器。第三条语句是把以段寄存器DS中的数据为段地址,以[ ]中的数据为偏移地址,访问这一内存空间的数据,并将其送入寄存器al中。

PS:mov [0],al语句可以实现把al中的数据送入内存单元ds:0中。

<3>mov、add、sub指令

mov指令可以有如下的几种形式:

mov 寄存器,数据

mov 寄存器,寄存器

mov 寄存器,内存单元

mov 内存单元,寄存器

mov 段寄存器,寄存器

mov 寄存器,段寄存器

mov 内存单元,段寄存器

mov 段寄存器,内存单元

add和sub指令也有两个操作对象,可以有如下的几种形式:

add 寄存器,数据

add 寄存器,寄存器

add 寄存器,内存单元

add 内存单元,寄存器

sub 寄存器,数据

sub 寄存器,寄存器

sub 寄存器,内存单元

sub 内存单元,寄存器

经过自行验证发现add和sub是无法对段寄存器进行操作的。

<4>栈

栈是一种有特殊访问方式的存储空间,先进后出(LIFO)。

8086CPU提供入栈和出栈的指令,最基本的两个为PUSH和POP。push ax表示把寄存器ax中的数据送入栈中,pop ax表示从栈顶取出数据送入ax。在入栈和出栈的操作中都是以字为单位进行的。栈底:  固定的一端,栈区最高地址单元的前一个单元。下图即为一个栈空间,我们对其进行相关的操作。

在上图中,我们想要把1126H存入栈区,首先先把栈顶上移两个单元,即栈顶-2=栈顶,然后存入数据。

从栈区取出元素5020H首先取出数据,然后栈顶下移两个单元,栈顶+2=栈顶。

8086CPU中有两个寄存器,段寄存器SS和寄存器SP,栈顶的段地址存放在SS中,偏移地址存放在SP中,任意时刻SS:SP都指向栈顶元素。对应上面的push和pop操作,入栈时,(1)SP=SP-2,SS:SP指向当前栈顶前面的单元,并以此为新的栈顶。(2)将ax中的内容送入SS:SP指向的内存单元处,SS:SP此时指向新的栈顶。出栈时,(1)将SS:SP指向的内存单元处的数据送入ax中。(2)SP=SP+2,SS:SP指向当前栈顶下面的单元,并以此为新的栈顶。

当栈满时用push入栈和栈空时用pop出栈都会发生栈顶超界问题,会对栈以外的数据进行改写,可能引发一连串的错误。而8086CPU也没有一定的机制去防止此类现象的发生,所以我们在使用栈的时候进行入栈和出栈操作要先确定栈并没有处于满或者空的状态。

pop和push指令可以在寄存器和内存单元、段寄存器和内存单元、内存单元和内存单元之间传送数据。

当我们将长度为N的一组连续并且起始地址为16的倍数的内存单元当作栈空间使用时,CPU并不知道这是栈段,我们只要使SS:SP指向我们所定义的栈段即可。

小结:在这章我们学习了内存访问的相关指令及其规则和栈的结构与指令,学习了新的段寄存器SS:SP。栈在解决某些问题时由于先进后出的特点具有一定的优势,比如逆序输出等,主要还是要在脑子中对其结构有很好的刻画才能很好的掌握它的运行机制。

原文地址:https://www.cnblogs.com/zsznb/p/10045626.html

时间: 2024-10-11 17:19:54

第三章 寄存器(内存访问)的相关文章

汇编语言:第三章 寄存器(内存访问)

3.1内存中字的存储 CPU中寄存器是16位的,可以用高低字节存储一个字,但是每个内存单元是8位的,只能存储一个字节, 所以内存中用相邻2个内存单元存储一个字的高低字节 如:20000数值(4E20H)在地址0的内存单元数值为20H,在地址1的内存单元数值为4EH 两个内存单元存储一个字型数据叫做一个字单元, 字单元的起始地址为N就叫N地址字单元,表示一个字的低字节在地址N的内存单元,高字节在地址N+1的内存单元 任意连续的2个内存单元都可以组成一个字单元 3.2 DS和 [address] C

汇编语言(王爽) 第3章寄存器(内存访问)

3.1 内存中的字 内存中的字是16位的,以2个内存单元存储 地址大的存高位(字的左边8位),地址小的存低位(字的右边8位) 字单元:存放1个字形数据的内存单元,由2个内存单元组成,共16位 3.2 DS 一个寄存器的名字,用来放数据段的段地址 mov 指令可以把数据转到寄存器,一个寄存器的内容转到另一个寄存器,内存单元(字单元)转到寄存器 但是一般会mov ax,1000h;mov ds,ax而不是直接mov ds,1000h 因为8086CPU不支持直接把内存单元的东西转到段寄存器上面 3.

《java并发编程的艺术》读书笔记-第三章Java内存模型(二)

一概述 本文属于<java并发编程的艺术>读书笔记系列,第三章java内存模型第二部分. 二final的内存语义 final在Java中是一个保留的关键字,可以声明成员变量.方法.类以及本地变量.可以参照之前整理的关键字final.这里作者主要介绍final域的内存语义. 对于final域,编译器和处理器要遵守两个重排序规则: 在构造函数内对一个final域的写入,与随后把这个被构造对象的引用赋值给一个引用变量,这两个操作之间不能重排序. 初次读一个包含final域的对象的引用,与随后初次读这

&lt;java并发编程的艺术&gt;读书笔记-第三章java内存模型(一)

一概述 本文属于<java并发编程的艺术>读书笔记系列,继续第三章java内存模型. 二重排序 2.1数据依赖性 如果两个操作访问同一个变量,且这两个操作中有一个为写操作,此时这两个操作之间就存在数据依赖性.数据依赖分下列三种类型: 名称 代码示例 说明 写后读 a = 1;b = a; 写一个变量之后,再读这个位置. 写后写 a = 1;a = 2; 写一个变量之后,再写这个变量. 读后写 a = b;b = 1; 读一个变量之后,再写这个变量. 上面三种情况,只要重排序两个操作的执行顺序,

3.寄存器(内存访问)

寄存器(内存访问) 看到标题才发现,第二章是寄存器直接与常量(数字)进行交互 内存中字的存储假设读取字节(流)为从左向右读对字的处理为从又向左正是因为不同,所以才会发问吧 DS与偏移地址:通用的获取地址的方式(CS:IP这个是给程序用的)类似于通用寄存器,但不能使用move ds,1:单纯的说指令太少了的话也对(jmp 不也就省2指令,还多出N多种),应该是跟指令流程相关(intel 指令手册,我的第一反应其实是是使用灵活的方式进行修改还是使用通用的方式进行修改...小学语文学太多了,自动升华)

汇编学习笔记03(寄存器内存访问)

1. 字在内存中存储时, 要有两个地址连续的内存单元来存放. 字的低位字节存放在低地址单元中, 高位字节存放在高地址单元中. 2. DS: 存放段地址的寄存器, 这个段是存放数据的. [address]: 偏移地址 mov指令在访问内存单元时, 只给出偏移地址, 段地址默认在DS段寄存器中 3. mov ax, 1000 mov ds, ax 8086CPU不支持将数据直接送入段寄存器, 所以只能通过通用寄存器来进行中转. 4. 字的传送 80806CPU是16位结构, 有16根数据线, 所以一

(第三章)Java内存模型

一.java内存模型的基础 1.1 并发编程模型的两个关键问题 在并发编程中,需要处理两个关键问题:线程之间如何通信及线程之间如何同步(这里的线程是指并发执行的活动实体).通信是指线程之间以何种机制来交换信息.在命令式编程中,线程之间的通信机制有两种:共享内存和消息传递. 在共享内存的模型里,线程之间共享程序的公共状态,通过读-写内存中的公共状态来进行隐式通信.在消息传递的并发模型里,线程之间没有公共状态,线程之间必须通过发送消息来显示进行通信. 同步是指程序中用于控制不同线程间操作发生相对顺序

第三章 JVM内存回收区域+对象存活的判断+引用类型+垃圾回收线程

注意:本文主要参考自<深入理解Java虚拟机(第二版)> 说明:查看本文之前,推荐先知道JVM内存结构,见<第一章 JVM内存结构> 1.内存回收的区域 堆:这是GC的主要区域 方法区:回收两样东西 无用的类 废弃的常量 栈和PC寄存器是线程私有区域,不发生GC 2.怎样判断对象是否存活 垃圾回收:回收掉死亡对象所占的内存.判断对象是否死亡,有两种方式: 引用计数法 原理:给对象添加一个引用计数器,每当有一个地方引用它时,计数器值+1:引用失效时,计数器值-1 实际中不用,不用的两

寄存器(内存访问)

1.内存访问 CPU要读写一个内存单元的时候,必须先给出这个内存单元的地址,在8086CPU中,内存地址由段地址和偏移地址组成.8086中有一个DS寄存器,通常用来存放要访问数据的段地址.例如我们要读取10000H单元的内容,可以用如下的程序段进行. mov bx,1000H mov ds,bx mov al,[0] [...]表示一个内存单元,其中的0表示内存单元的偏移地址.段地址从ds中获取. 8086CPU不支持将数据直接送入段寄存器的操作,所以使用寄存器bx作个中转. 2.几个指令 mo