数据段
将一组内存单元定位为一个段,长度为N(<=64KB),起始地址为16的倍数的内存单元。专门用来存储数据的内存空间。
与这个空间相关的寄存器有
DS:段地址
[0]:偏移为0
mov ax,123H
#将123H送入AX
mov ds,ax
#将AX送入DS,由于这个寄存器不能直接传入,需要通过其他寄存器中转
mov ax,0
#将ax清0
add ax,[0]
#将123:0偏移的数据加入AX 0内存单元and1内存单元
add ax,[2]
#将123:2偏移的数据加入ax 2内存单元and3内存单元
add ax,[4]
#将123:4偏移的数据加入ax 4内存单元and5内存单元
栈
栈就像一个储物箱。只能一本一本放进去
拿出来也一样,只能一本一本拿出来,这个叫做先进后出
CPU提供的栈机制
与栈相关的寄存器有SS:SP
SS:表示了栈的地址
SP:表示栈的偏移
SP为=0010,这里先不讲为什么
将0123传入栈。01为高地址,对应栈内F高地址,23低地址对应栈内E低地址
这时候SP为0010-2=000E,代表栈顶为000E,下一次数据存放在000C和000D两个内存单元
这时候再传入2266,存入1000C和1000D两个内存单元
SP再-2=000C
入栈,是SP-2再入栈
出栈,是先出栈,SP+2
为什么栈内为空时,SP=10呢,任意时候,SS:SP指向栈顶,当只有一个元素(数据)的时候,SP=000E,如果没数据,那就SP+2=000E+2=0010
先-2,再入栈
栈顶在0010-2=000E,入栈占用的内存单元为000E,000F
栈顶在000E-2=000D,入栈占用的内存单元为000C,000D
出栈则相反
push、pop指令
SS=1000
SP=0010
push AX
#将AX的数据放入1000:10(000E,000F) sp=000E
pop BX
#将栈中的数据取出给BX(000E,000F) SP=0010