1、内存中字的存储
高地址存储高位,低地址存储地位。
例:0号单元是低地址单元,1号单元是高地址单元
任何两个地址连续的内存单元,N号单元和N+1号单元,可以将它们看成两个内存单元,也可以看成一个地址为N的字单元中的高位字节单元和地位字节单元。
2、DS和[adress]
CPU要读取一个内存单元的时候,必须先给出这个内存单元的地址。
在8086PC中,内存地址的段地址和偏移地址组成。
在8086CPU中有一个DS寄存器,通常用来存放要访问的数据的段地址。[adress]表示一个偏移地址的address的内存单元。
mov指令可完成的传送功能:
- 将数据直接送入寄存器中
- 将一个寄存器中的内容送入另一个寄存器中
- 将一个内存单元中的内容送入一个寄存器中
例:
mov bx,1000H
mov ds,bx
mov al,[0]
上面三条指令将10000H(1000:0)中的数据读到al中。
8086CPU不支持将数据直接送入段寄存器中,但支持通用寄存器。
内存单元(数据)-->通用寄存器-->段寄存器
将数据从段寄存器送入内存单元
mov bx,ds
mov [0],bx
段寄存器-->通用寄存器-->内存单元(数据)
3、字的传送(16位数据的传送)
例:
mov bx,1000H
mov ds,bx
mov ax,[0] ;1000:0处字型数据送入ax中
mov [0],cx ;cx中16位数据送入1000:0处
例:
写出指令执行后寄存器ax、bx、cx中的值
1 mov ax,1000H
2 mov ds,ax
3 mov ax,[2]
4 mov bx,[2]
5 mov cx,[1]
6 add bx,[1]
7 add cx,[2]
10000H 23
10001H 11
10002H 22
10003H 66
1:ax=1000H
2:ds=ax=1000H
3:ax=11:23=0B17H
4:bx=66:22=4216H
5:cx=22:11=160BH
6:bx=4216H+160BH=5821H
7:cx=160BH+4216H=5821H
4、mov,add,sub(减)指令
mov指令形式:
mov 寄存器,数据 | mov ax,10 |
mov 寄存器,寄存器 | mov bx,ax |
mov 寄存器,内存单元 | mov ax,[0] |
mov 内存单元,寄存器 | mov [0],ax |
mov 段寄存器,寄存器 | mov ds,ax |
mov 寄存器,段寄存器 | mov ax,ds |
add和sub指令通mov一样。
段寄存器不能运算。
5、数据段
将一个长度为N(N<=64K)地址连续,起始地址为16的倍数的内存单元当做专门存储数据的内存。
例:123B0H~123B9H这段空间来存放数据
段地址:123BH
长度:10字节
访问数据段
mov ax,123BH
mov ds,ax
mov al,0
add al,[0]
add al,[1]
add al,[2]
6、栈
栈是一种具有特殊的访问方式的存储空间。
特征:先进后出
基本操作:入栈和出栈
入栈:将一个新的元素放入栈顶
出栈:从栈顶取出一个元素
8086CPU提供入栈出栈的指令:(最基本)
入栈:push 寄存器 (将寄存器数据放入栈中)
出栈:pop 寄存器 (将栈顶取出数据送入寄存器中)
以字为单位进行的(16位)
段寄存器ss:存放栈顶的段地址
寄存器sp:存放栈顶的偏移地址
任何时刻,ss:sp指向栈顶元素。
push ax:1.sp=sp-2;2.将ax数据存入栈中
pop ax:1.将ss:sp指向的内存单元的数据送入ax中; 2.sp=sp+2
8、栈顶越界问题
ss和sp只保证入栈和出栈时能找到栈顶。
在编程时需要自己注意栈顶越界问题,要根据可能用到的最大栈空间来安排栈的大小,防止入栈的数据太多导致的越界。
9、push、pop指令
push、pop可操作寄存器,内存单元、段寄存器。
初始化操作:
mov ax,1000H
mov ss,ax ;设置栈的段地址
mov sp,0010H :设置栈的偏移地址
例:
- 将10000H~1000FH这段空间当做栈,初始状态为空
- 设置AX=001AH,BX=001BH
- 将AX、BX中的数据入栈
- 将AX、BX清空
- 从栈中恢复AX、BX的内容
mov ax,1000H
mov ss,ax
mov sp,0010H
mov ax,001AH
mov bx,001BH
push ax
push bx
sub ax,ax mov ax,0
sub bx,bx mov bx,0
pop bx
pop ax
注意:出栈顺序与入栈顺序相反
例:
利用栈,交换AX和BX中的数据
push ax
push bx
pop ax
pop bx
10、栈段
将长度为N(N<=64K)的一组地址连续、起始地址为16的倍数的内存单元当做栈使用。
若栈段为10000H~1FFFFH,则ss=1000H,sp因为溢出sp=0。