06.内存访问

字单元

字单元,即存放一个字型数据(16位)的内存单元,由两个地址连续的内存单元组成。

将起始地址为N的字单元简称为N地址字单元。比如一个字单元由2、3两个内存单元组成,则这字单元的起始地址为2,我们可以说这是2地址字单元。

DS

DS寄存器用来存放要访问数据的段地址。

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

上面三条指令将10000H(1000:0)中的数据读到al中
10000H用段地址和偏移地址表示为1000:0,我们先将段地址1000H放入ds,然后用mov al,[0]完成传送。mov指令中的[]说明操作对象是一个内存单元,[]中的0说明这个内存单元的偏移地址是0,它的段地址默放在ds中,指令执行时,8086CPU会自动从ds中取出。

8086CPU不支持将数据直接送入段寄存器的操作,ds是一个段寄存器,所以mov ds,1000H这条指令是非法的。那么如何将1000H送入ds呢?只好用一个寄存器来进行中转,即先将1000H送入一个一般的寄器,如bx,再将bx中的内容送入ds。

mov、add、sub指令

均带有两个操作对象

mov指令主要形式

mov 寄存器、数据
mov 寄存器、寄存器
mov 寄存器、内存单元
mov 内存单元、寄存器
mov 段寄存器、寄存器

add和sub指令主要形式

add 寄存器、数据
add 寄存器、寄存器
add 寄存器、内存单元
add 内存单元、寄存器

数据段

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

比如,将123BOH-123B9H的内存单元定义为数据段。现在要累加这个数据段中的前3个单元中的数据,代码如下。
在这里插入图片描述

CPU提供的栈机制

基于8086CPU编程的时候,可以将一段内存当作栈来使用

push ax表示将寄存器ax中的数据送入栈中,pop ax表示从栈顶取出数据送入ax

8086CPU中,有两个寄存器,段寄存器SS和寄存器SP,栈顶的段地址存放在SS中,偏移地址存放在SP中。任意时刻,SS:SP指向栈顶元素。push指令和pop指令执行时,CPU从SS和SP中得到栈顶的地址。

栈顶超界问题

8086CPU不保证我们对栈的操作不会超界。

push、pop指令

在这里插入图片描述
在这里插入图片描述在这里插入图片描述

段与寄存器

  • CPU将内存中的某段内容当作代码,是因CS:IP指向了那里;
  • CPU将某段内存当作栈,是因为SS:SP指向了那里;
  • CPU将某段内存当作数据段,是因为DS指向了那里;

一段内存,可以既是代码的存储空间、又是数据的存储空间,还可以是栈空间,也可以什么也是。
关键在于CPU中寄存器的设置,即CS、IP、SS、SP、DS的指向。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值