知识点:内存中字的存储、DS和[address]、字的传送、mov,add,sub指令、数据段、栈、CPU提供的栈机制、栈顶超界的问题、push,pop指令、栈段。
内存中字的存储
CPU中,用16位寄存器来存储一个字。高8位存放高位字节,低8位存放低位字节。
在内存中存储时,由于内存单元是字节单元(一个单元存放一个字节),则一个字要用两个地址连接的内存单元来存放,这个字的低位字节放在低地址单元中,高位字节存放在高地址单元中。
字单元:即存放一个字型数据(16位)的内存单元,由两个地址连续的内存单元组成。高地址内存单元中存放字型数据的高位字节,低地址内存单元中存放字型数据的低位字节。
任何两个地址连续的内存单元,N号单元和N+1号单元,可以将它们看成两个内存单元,也可看成一个地址为N的字单元中的高位字节单元和低位字节单元。
DS和[address]
CPU要读写一个内存单元的时候,必须先给出这个内存单元的地址,在8086CPU中,内存地址由段地址和偏移地址组成。
8086CPU中有一个DS寄存器,通常用来存放要访问数据的段地址。
mov指令,可完成三种传送:
(1)将数据直接送入寄存器;
mov 寄存器名,数据
(2)将一个寄存器中的内容送入另一个寄存器;
mov 寄存器名,寄存器名
(3)将一个内存单元中的内容送入一个寄存器中。
mov 寄存器,[内存单元的偏移地址]
“[...]”表示一个内存单元的偏移地址,我们知道,只有偏移地址是不能定位一个内存单元的,那么内存单元的段地址是多少呢?
指令执行时,8086CPU自动取ds中的数据为内存单元的段地址。
所以,我们需要根据情况,改变ds中的数据。
比如 mov ds, 1000H
但是,8086CPU不支持将数据直接送入段寄存器的操作,ds是一个段寄存器,所以mov ds, 1000H这条指令是非法的。
那么如何将1000H送入ds呢?只好用一个寄存器来进行中转,即先将1000H送入一个一般的寄存器,如bx,再将bx中的内容送入ds。
怎样将数据从寄存器送入内存单元?
从内存单元到寄存器的格式是:mov 寄存器名,内存单元地址
从寄存器到内存单元则是:mov 内存单元地址,寄存器名。
将al中的数据送入内存单元10000H。
10000H可表示为1000:0,用ds存放段地址1000H,偏移地址是0,则:mov [0], al可完成从al到10000H的数据传送。
mov bx, 1000H
mov ds, bx
mov [0], al
字的传送
mov指令在寄存器和内存之间进行字节型数据的传送。
因为8086CPU是16位结构,有16根数据线,所以,可以一次性传送16位的数据,也就是说可以一次性传送一个字。
我们只要在mov指令中给出16位的寄存器就可以进