汇编的数据段和栈

来源:互联网 发布:提词器软件下载 编辑:程序博客网 时间:2024/05/21 09:29

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存放栈顶偏移地址。入栈时,栈顶从高地址向低地址方向增长。



0 0
原创粉丝点击