寄存器02

1.内存中字的储存
在8086cpu架构中,一个内存单元为1个字节8位;
一个字有2个字节,16位,占2个内存单元;
任何两个地址连续的内存单元,N和N+1;
可以将它们看作两个内存单元,也可看做地址为N的内存单元的高位字节和低位字节;
 
如上图:
    1地址的单元存放的字型数据为:124EH,存放的字节型数据为:12H;
    0地址的单元存放的字型数据为:4E20H,存放的字节型数据为:20H;
 
2.寄存器DS和[address]
ds寄存器用来存放要访问数据地址的段地址;
在8086cpu中不支持直接将数据送入段寄存器,因此需要借助其它寄存器;
 
[address]表示偏移地址;
内存单元地址由段地址和偏移地址组成;
8086cpu访问内存数据时,段地址从ds寄存器中获取,偏移地址为address的值;
 
例如:从内存单元10000H中获取数据并存入寄存器al;
    为了访问10000H,需要将段地址设为1000H,偏移地址设为0H;
    也就是ds的值为1000H,偏移地址为[0];
    由于无法直接将1000H送入ds,需要借助另一个寄存器bx;
    代码:
mov bx,1000
mov ds,bx
mov al,[0]
 
如果要传递的时字型数据,需要用到16位的寄存器;
例如:将10000H处的字型数据读到寄存器ax,并将cx的字型数据写入该处;
mov bx,1000
mov ds,bx
mov ax,[0]
mov [0],cx
 
指令相关:
    mov    ->赋值
    add    ->加
    sub    ->减
 
3.数据段
和代码段类似,只不过是用来存放数据的段;
可以将长度为N(N<=64)的一组数据存放在地址连续且起始地址为16的倍数的内存单元中,称为数据段;
例如:10000H-10009H可以作为一个数据段,该数据段的起始地址是10000H,长度是10;
访问该数据段需要用到段寄存器ds,以及偏移地址[address];
比如累加该数据段前3个字节的数据代码:
mov ax,1000
mov dx,ax
mov al,0
add al,[0]
add al,[1]
add al,[2]
 
4.栈
栈是一种具有特殊访问方式的存储空间;
最大的特点是后进先出LIFO;
就像从一个一端封闭的盒子里放和取东西一样;
对于栈主要有两种操作:
    1】入栈    ->将新元素放入栈顶;
    2】出栈    ->从栈顶取出一个元素;
 
1)8086cpu的栈机制
在基于8086cpu编程时,可以将一段内存当做栈来使用;
8086cpu提供了两个操作栈的指令:
    push    ->入栈;
    pop    ->出栈;
例如:将寄存器ax中的数据入栈
push ax    
从栈顶取出数据保存在寄存器ax
pop ax
8086cpu的入栈和出栈都是以字为单位的,也就是每次操作2个字节16位的数据;
如图:以栈的方式访问内存空间
 
2)ss:sp寄存器
8086cpu通过两个寄存器ss:sp来识别栈,就像用cs:ip来识别指令一样;
    ss    ->存放栈顶的段地址;
    sp    ->存放栈顶的偏移地址;
任意时刻,ss:sp指向栈顶元素,push和pop指令执行时cpu从ss和sp中得到栈顶地址;
 
push ax 指令的执行过程:
    1】sp=sp-2,使ss:sp指向栈顶前面一个单元;
    2】将ax的数据送入ss:sp指向的单元,该单元为新的栈顶;
pop ax 指令的执行过程与push ax相反;
 
3)栈顶超界的问题
当栈满时执行push,或者当栈空时执行pop将发生栈顶超界问题;
在8086cpu中,只有ss:sp只记录了栈顶位置,没有其他寄存器来记录栈的上限和下限;
也就是说,8086cpu不保证我们对栈的操作不会超界;需要在编程的时候自己防止超界问题;
 
4)push和pop指令
push 寄存器    ->将寄存器中的值入栈
push ax
 
push 段寄存器    ->将段寄存器中的值入栈
push ds
 
push 内存单元    ->将一个内存单元处的字入栈
mov ax,1000
mov ds,ax
push [0]
pop [2]
 
5)利用栈交换ax和bx的值
代码:
mov ax,1000
mov ss,ax
mov sp,10
mov ax,1a
mov bx,1b
push ax
push bx
pop ax
pop bx
 
6)栈段
和代码段以及数据段类似,可以将一段连续的内存单元当做栈来使用,该段内存单元为栈段;
栈段的起始地址为16的倍数,且最大长度不能大于64kb;
例如:将10000H-1FFFFH这段空间作为一个栈段;
    ss=1000H;
    最底部字单元地址位1000:FFFE;
    任意时刻ss:sp指向栈顶;
    当栈为空时相当于唯一的一个元素出栈,出栈时sp=sp+2,因此空栈时ss:sp=1000:0;
    也就是说空栈时ss:sp指向的是栈最底部单元下面的单元,该单元的地址是:栈最底部字+2;
 
posted @ 2019-06-12 16:39  L丶银甲闪闪  阅读(164)  评论(0编辑  收藏  举报