汇编的数据段和栈

本文详细解释了8086CPU中DS寄存器的作用及其在内存访问和栈操作中的应用。通过具体指令示例,阐述了如何使用DS寄存器进行数据读写,并深入探讨了栈的概念、如何识别栈空间以及入栈、出栈操作的实现。了解这些基础知识对于深入掌握8086CPU的工作原理至关重要。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.DS和[address]

例如:我们要读取10000H单元的内容可以用如下程序进行

mov bx,1000H

mov ds,bx

mov al,[0]

上面的三条指令是将10000H(1000:0)中的数据读到al中。

[...]表示一个内存单元,[...]中的0表示内存单元的偏移地址。我们知道只有偏移地址是不能定位一个内存单元的,那么内存单元的段地址是多少呢?指令执行时,8086CPU自动获取ds中的数据位内存单元的段地址。


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

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


2.字的传送

前面我们用mov指令在寄存器和内存之间进行字节型数据的传送,因为8086CPU是16位结构,有16根数据线,所以,可以一次传送16位的数据,也就是说可以一次性传送一个字。我们只要在mov指令中给出16位寄存器就可以进行16位数据的传送了。比如:

mov bx,1000H;

mov ds,bx;

mov ax,[0];

mov [0],cx;cx中的16位数据送到1000:0处



3.栈

8086CPU的入栈和出栈操作是以字为单位进行的。注意:字型数据用俩个单元存放,搞地址单元存放高8位,低地址段元放低8位。有俩个问题如下:

1.CPU如何知道一段内存空间被当做栈?

2.执行push和pop时候,如果知道哪个单元是栈顶

答案:SS:SP,段寄存器SS存放栈顶段地址,SP存放栈顶偏移地址。入栈时,栈顶从高地址向低地址方向增长。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值