首页 > 代码库 > 汇编的数据段和栈
汇编的数据段和栈
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存放栈顶偏移地址。入栈时,栈顶从高地址向低地址方向增长。