汇编语言第2章—寄存器

8086CPU有14个寄存器,分别是:AX、BX、CX、DX、SI、DI、SP、BP、IP、CS、SS、DS、ES、PSW。
2.1  通用寄存器
        8086CPU的所有寄存器都是16位的,可以存放两个字节。AX、BX、CX、DX这4个寄存器通常用来存放一般性的数据,称为通用寄存器
8086CPU的
AX、BX、CX、DX这4个寄存器可以分为两个独立使用的8位寄存器:
(1)AX可以分为AH和AL;
(2)BX可以分为BH何BL;

(3)CX可以分为CH何CL;
(4)DX可以分为DH何DL;


2.2  物理地址
        所有的内存单元构成的内存空间是一个一维的线性空间,每一个内存单元在这个空间中有唯一的地址,成这个唯一的地址为
物理地址


2.3  8086CPU给出物理地址的方法
        8086CPU是16位结构,这就是说在8086内部,能够一次性处理、传输、暂时存储的最大长度为16位。8086CPU有20位地址总线,可以传送20位地址。8086CPU又是16位结构,只能送出16位地址。8086CPU采用一种在内部使用两个16位地址合成的方法形成20位物理地址。相关部件的逻辑结构如下图所示:


                                               图1  8086CPU相关部件的结构
如图1所示,当8086CPU读写内存时:
(1)CPU中的相关部件提供两个16位的地址,一个称为
段地址,一个称为偏移地址
(2)段地址和偏移地址通过内部总线送入一个称为地址加法器的部件;
(3)地址加法器将两个16位地址合成一个20位的物理地址(
物理地址=段地址*16+偏移地址):
(4)地址加法器通过内部总线将20位物理地址送入输入输出控制电路;
(5)输入输出控制电路将20位物理地址送上地址总线:
(6)20位物理地址被地址总线传送到寄存器。


2.4  段寄存器
        8086CPU有4个段寄存器:CS、DS、SS、ES

2.4.1  CS段寄存器
        CS和IP指示CPU当前要读取指令的地址。
CS:IP指向的内容当做指令执行。CS为代码段寄存器,IP为指令指针寄存器
       
同时修改CS、IP的内容,可使用形如 “jmp 段地址:偏移地址”,jmp 2AE3:3执行后,CS=2AE3,IP=3,CPU从2AE33H处读取指令。“jmp 段地址:偏移地址”指令的功能为:用指令中给出的段地址修改CS,偏移地址修改IP。
        若仅修改IP的内容,可用“
jmp 某一合法寄存器”的指令来完成,用寄存器中的值修改IP,如jmp ax。

2.4.2  DS段寄存器和[address]
        DS寄存器用于存放要访问
数据的段地址。[address]表示一个偏移地址为address的内存单元,CPU使用DS*16+address做为数据的地址来访问相应地址单元中的数据。

mov ax ,123BH     //将数据123BH传递给ax
mov ds ,ax        //将ax中的数据传递给段寄存器ds
mov ax ,0        //将ax寄存器赋值为0
add ax,[0]        //将数据段第一个字(偏移地址为0)加到ax中

2.4.3栈段寄存器
        8086CPU中,段寄存器SS和寄存器SP,
栈顶放在SS中,偏移地址放在SP中。任意时刻,SS:SP指向栈顶元素。push指令和pop指令执行时,CPU从SS和SP中得到栈顶的地址。
       
push为入栈指令形式为,push   寄存器,表示将一个寄存器中的数据入栈。如push ax,由以下两步完成:
        (1)SP=SP-2,SS:SP指向当前栈顶前面的单元,以当前栈顶前面的单元为新的栈顶
        (2)将ax中的内容送入SS:SP指向的内存单元处,SS:SP此时指向新的栈顶
        push指令 格式包含如下:
                push 寄存器
                push 段寄存器
                push 内存单元
     
  pop指令为出栈指令,形式为 pop  寄存器表示将一个寄存器中的数据出栈。如pop ax,由以下两步完成:
        (1)将SS:SP指向的内存单元处的数据送入ax中;
        (2)SP=SP+2,SS:SP指向当前栈顶下面的单元,以当前栈顶下面的单元为新的栈顶。
        pop指令 格式包含如下:
                pop  寄存器
                pop  段寄存器
                pop  内存单元

 

段的综述
        可以将一段内存定义为一个段,用一个段地址指示段,用偏移地址访问段内的单元。可以用一个段存放数据,将它定义为“数据段”;对于一个数据段,将它的段地址放在DS中,用mov、add、sub等访问内存单元的指令时,CPU将我们定义的数据段中的内容当做数据来访问;

        可以用一个段存放代码,将它定义为“代码段”;将它的段地址放在CS中,将段中第一条指令的偏移地址放在IP中,这样CPU将执行我们定义的代码段中的指令;

        可以用一个段当做栈,将它定义为“栈段”;对于栈段,将它的段地址放在SS中,将栈顶的偏移地址放在SP中,这样CPU执行栈操作时,比如执行pop、push等指令,就将我们定义的栈段当做栈空间使用。

        一段内存,可以既是代码的存储空间,又是数据的存储空间,还可以是栈空间,也可以什么也不是。关键在于CPU中寄存器的设置,即CS、IP,SS、SP,DS的指向。



 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值