寄存器(内存访问)

1、内存中字的存储

高地址存储高位,低地址存储地位。

例:0号单元是低地址单元,1号单元是高地址单元

任何两个地址连续的内存单元,N号单元和N+1号单元,可以将它们看成两个内存单元,也可以看成一个地址为N的字单元中的高位字节单元和地位字节单元。

2、DS和[adress]

CPU要读取一个内存单元的时候,必须先给出这个内存单元的地址。

在8086PC中,内存地址的段地址和偏移地址组成。

在8086CPU中有一个DS寄存器,通常用来存放要访问的数据的段地址。[adress]表示一个偏移地址的address的内存单元。

mov指令可完成的传送功能:

  1. 将数据直接送入寄存器中
  2. 将一个寄存器中的内容送入另一个寄存器中
  3. 将一个内存单元中的内容送入一个寄存器中

例:

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     :设置栈的偏移地址

例:

  1. 将10000H~1000FH这段空间当做栈,初始状态为空
  2. 设置AX=001AH,BX=001BH
  3. 将AX、BX中的数据入栈
  4. 将AX、BX清空
  5. 从栈中恢复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。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值