寄存器(内存访问)

1、内存访问

CPU要读写一个内存单元的时候,必须先给出这个内存单元的地址,在8086CPU中,内存地址由段地址和偏移地址组成。8086中有一个DS寄存器,通常用来存放要访问数据的段地址。例如我们要读取10000H单元的内容,可以用如下的程序段进行。

mov  bx,1000H
mov  ds,bx
mov  al,[0]

[...]表示一个内存单元,其中的0表示内存单元的偏移地址。段地址从ds中获取。

8086CPU不支持将数据直接送入段寄存器的操作,所以使用寄存器bx作个中转。

2、几个指令

mov  寄存器,数据

mov  寄存器,寄存器

mov  寄存器,内存单元

mov  寄存器,段寄存器

mov  段寄存器,寄存器

mov  段寄存器,内存单元

mov  内存单元,段寄存器

mov  内存单元,寄存器

add  寄存器,数据

add 寄存器,寄存器

add 寄存器,内存单元

add 内存单元,寄存器

sub 寄存器,数据

sub 寄存器,寄存器

sub 寄存器,内存单元

sub 内存单元,寄存器

注意:add ds,ax是错误的指令。

3、数据段

对于8086PC机,在编程时,可以根据需要,将一组内存单元定义为一个段。我们可以将一组长度为N(N<=64KB)、地址连续、起始地址为16的倍数的内存单元当作专门存储数据的内存空间,从而定义了一个数据段。

将一段内存当作数据段,是我们在编程时的一种安排,可以在具体操作的时候,用ds存放数据段的段地址,再根据需要,用相关指令访问数据段中的具体单元。

4、栈

栈是一种具有特殊的访问方式的存储空间。栈有两个基本操作:入栈和出栈。入栈是将一个新的元素放到栈顶,出栈是从栈顶取出一个元素。栈的操作规则是LIFO(Last In First Out,后进先出)。

8086CPU提供相关的指令来以栈的方式访问内存空间,也就是在基于8086CPU编程时,可以将一段内存当作栈来使用。一个栈段容量最大为64KB。

8086CPU提供PUSH(入栈)和POP(出栈)指令。

8086CPU中有两个寄存器,段寄存器SS和寄存器SP,任意时刻,SS:SP指向栈顶元素。

push ax的执行,由以下两步完成。

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

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

入栈时,栈顶从高地址向低地址方向增长。

注意:

如果将10000H~1000FH这段空间当作栈,初始状态栈是空的,此时,SS=1000H,SP=0010H。

如果将10000H~1FFFFH这段空间当作栈,初始状态栈是空的,此时,SS=1000H,SP=0。

pop ax的执行过程和push ax正好相反,

1)将SS:SP指向的内存单元处的数据送入ax中;

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

注意:8086CPU不保证我们对栈的操作不会越界,我们在编程的时候需要自己操心栈顶越界的问题,要根据可能用到的最大栈空间,来安排栈的大小。

push和pop指令的格式可以如下:

push  寄存器

pop   寄存器

push  段寄存器

pop   段寄存器

push  内存单元

pop   内存单元

5、段的总结

我们可以将一段内存定义为一个段,用一个段地址指示段,用偏移地址访问段内的单元,这完全是我们自己的安排。

我们可以用一个段存放数据,将它定义为"数据段";

我们可以用一个段存放代码,将它定义为"代码段";

我们可以用一个段当作栈,将它定义为"栈段"。

我们可以这样安排,但若要让CPU按照我们的安排来访问这些段,就要:

对于数据段,将它的段地址放在DS中,用mov、add、sub等访问内存单元的指令时,CPU就将我们定义的数据段中的内容当作数据来访问。

对于代码段,将它的段地址放在CS中,将段中的第一条指令的偏移地址放在IP中,这样CPU就将执行我们定义的代码段中的指令。

对于栈段,将它的段地址放在SS中,将栈顶单元的偏移地址放在SP中,这样CPU在需要进行栈操作的时候,比如push、pop指令等,就将我们定义的栈段当作栈空间来用。

原文地址:https://www.cnblogs.com/gkp307/p/9910298.html

时间: 2024-10-08 16:36:25

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

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根数据线, 所以一

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

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.

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

内存访问首先要有地址,8086pc中的段地址存放在 ds 寄存器中(ds 和 cs是不一样的,cs是定位地址用于读取内存中的指令或者数据,而ds是读取内存中的数据时使用,下面我们会明白区别) 将内存中的数据写入寄存器: mov bx,1000H mov ds,bx mov al,[0] 第一句是把1000H给bx(寄存器),第二句把bx中的值给ds(段地址寄存器),第三句从1000:0H中读取数据给al(寄存器ax的低8位):至于为什么不直接把段地址1000H给ds,这是8086硬件设计的问题,

汇编入门学习笔记 (二)—— 寄存器(内存访问)、栈

疯狂的暑假学习之  汇编入门学习笔记 (二) 参考:<汇编语言> 王爽  第三章 一.寄存器(内存访问) 1.DS和[address] DS 数据段寄存器,用来存放数据段地址 [address] 用来表示数据段的偏移地址 同样跟CS一样,不可以通过 mov ds, 1000 给ds赋值 要通过通用寄存器ax等. 例如: mov ax, 1000 mov ds, ax mov al, [0] 把1000:0的内容存进al mov bx, 1000 mov ds, bx mov [0], al 把

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

在第五章的学习之后,因为实验课在老师的抽查之后发现前面的知识很多都忘了,便对之前的知识进行了一遍系统的复习,对汇编的基础知识基本都已经掌握,也有了更加深刻的认识. 在第三章中我们主要从内存访问的角度来继续学习CPU执行指令的原理,并进一步的学习上一章的寄存器. <1>内存中字的存储 字由高位字节和低位字节组成,用16位寄存器来存储.高八位存放高位字节,低八位存放低位字节.字需要两个地址连续的内存单元(一个字节)来存储,字的低位字节存放在低地址单元中,高位字节存放在高地址单元中.如下图,我们想要

C++异常机制的实现方式和开销分析 (大图,编译器会为每个函数增加EHDL结构,组成一个单向链表,非常著名的“内存访问违例”出错对话框就是该机制的一种体现)

白杨 http://baiy.cn 在我几年前开始写<C++编码规范与指导>一文时,就已经规划着要加入这样一篇讨论 C++ 异常机制的文章了.没想到时隔几年以后才有机会把这个尾巴补完 :-). 还是那句开场白:“在恰当的场合使用恰当的特性” 对每个称职的 C++ 程序员来说都是一个基本标准.想要做到这点,就必须要了解语言中每个特性的实现方式及其时空开销.异常处理由于涉及大量底层内容,向来是 C++ 各种高级机制中较难理解和透彻掌握的部分.本文将在尽量少引入底层细节的前提下,讨论 C++ 中这一

ARM 汇编 内存访问指令

一. 单个寄存器操作读写内存 内存访问指令格式:<opcode><cond> Rd, [Rn] Rn 中保存的是一个内存的地址值 1. 内存写指令  [ str,strb,strh ]单个寄存器 1) [ str ]写 4 个字节 ldr r0, =0x12345678 @ mov r1, #0x40000000 str r0, [r1] @ 将r0中的数据写入 r1 指向的内存中; str写4个字节 2)[ strb ]写 1 个字节 strh r0, [r1] @ 把 r0 中