• 汇编寻址方式


    80x86的寻址方式

     计算机是通过运行指令序列来解决这个问题的,因此每种计算机都有一组指令系统提供给用户使用。这组指令集就称为计算机的指令系统。

     计算机中的指令由操作码字段和操作数字段两部分组成。

     指令的操作码字段在机器里面的表示比較简单,仅仅需对每一种操作指定确定的二进制代码就能够了。

     指令的操作数字段情况较为复杂。

     确定指令中用于说明操作数所在地址的方法称为寻址方法

     8086/8088有七种主要的寻址方式。

    1.马上寻址方式

     操作数就包括在指令中,它作为指令的一部分,跟在操作后存放在代码段。这样的操作数就称为马上数。

     马上数能够是8位的。也能够是16位的。

     假设是16位马上数,按“高高低低”原则进行读取。

     比如:MOV AX,1234H

     再如:MOV AL, 5  则运行指令后(AL)=05H

                MOV BX,2064H  则运行指令后,(BX)=3064H

     

    2.寄存器寻址方式

      操作数在CPU内部的寄存器中,指令指定寄存器号。

      对于16位操作数,寄存器能够是:

      AX,BX,CX,DX,SI,DI,SP,BP

      对于8位操作数。寄存器能够是:

      AL,AH,BL,BH,CL,CH,DL,DH

      这样的寻址方式因为操作数就在寄存器中,不须要訪问存储器来取得操作数,因而能够取得较高的运算速度。

      比如:MOV AX, BX

      如指令运行前(AX)=3064H,(BX)=1234H。则指令运行后,

      (AX)=1234H,  (BX)保持不变

      又如:  MOV SI,  AX

         MOV AL, DH

      都是寄存器寻址的的样例。



    3.直接寻址方式

     操作数在寄存器中。指令直接包括有操作数的有效地址(偏移地址)。

    操作数一般存放在数据段

     所以,操作数低地址由DS加上指令中直接给出的16位偏移得到。

     比如:假设(DS)=2000H ,MOV AX,[8054H]



    在汇编语言指令中,能够用符号地址取代数值地址

     如:MOV AX, VALUE

     此时,VALUE为存放操作数单元的符号地址。

     如写成:MOV AX, [VALUE]也是能够的,两者等价。

     如VALUE在附加段中。则应指定段超越前缀例如以下:

     MOV AX , ES : VALUE

     或MOVAX , ES:[VALUE]

     直接寻址方式经常使用语处理单个存储器变量的情况。它能够实如今64K字节的段内寻址操作数。直接寻址的操作数一般是程序使用的变量

     注意:马上寻址和直接寻址书写表示方法上是不同的,直接寻址的地址要放在方括号里。在源程序中,往往用变量名表示。

    4.寄存器间接寻址方式

     操作数在存储器中,操作数有效地址在SI、DI、BX、BP这四个寄存器之中的一个中。

     在普通情况下,假设有效地址在SI、DI和BX中,则以DS寄存器之内容位段值。

     假设有效地址在BP中。则以SS段寄存器之内容位段值。

     比如:假设(DS)=5000H 。(SI)=1234H

                MOV AX, [SI]

    指令中也可指定段超越前缀来取得其他段中的数据。

     如。MOV AX , ES : [BX]

     引用的段寄存器是ES

      请熟悉以下的表达形式:

     MOV [SI] , AX ; 目的操作数间接寻址

     MOV [BP] , CX ;目的操作数引用的段寄存器是SS

     MOV SI , AX; 目的操作数寄存器寻址



    5.寄存器相对寻址方式

     操作数在存储器中,操作数的有效地址是一个基址寄存器(BX、BP)或变址寄存器(SI、DI)内容加上指令中给定的8位或16位位移量之和。

     即:

     在普通情况下。假设SI、DI或BX之内容作为有效地址的一部分。那么引用的段寄存器是DS;假设BP之内容作为有效地址的一部分,那么引用的段寄存器是SS

     在指令中给定的8位或16位位移量採用补码形式表示。在计算有效地址时,如位移量是8位。则被带符号扩展成16位。

    比如:假设(DS)=5000H,(DI)=3678H

                MOV AX, [DI+1234H]

      则,物理地址=50000+3678+1223=5489BH

      如果该字存储单元的内容例如以下。则(AX)=55AAH

    请熟悉以下的写作形式:

      MOV BX , [BP-4]

      源操作数间接相对寻址。引用的段寄存器是SS。

      MOV ES : [BX + 5] , AL

      目的操作数採用寄存器相对寻址,引用的段寄存器是ES。

      指令MOV AX , [SI + 3]与MOV AX ,3[SI]是等价的。

    6.基址加变址寻址方式

      操作数在存储器中,操作数的有效地址是由:

      基址寄存器之中的一个的内容与变址寄存器之中的一个的内容相加。

     即:

    在普通情况下,假设BP之内容作为有效地址的一部分,那么引用的段寄存器是SS;否者以DS之内容为段值。

    比如:假设(DS)=2100H,(BX)=0158H,(DI)=10A5H

                MOV AX, [BX][DI]

      如果该字存储单元的内容例如以下,则(AX)=1234H



    以下两种表示方法是等价的:

     MOV AX , [BX + DI]

     MOV AX , [DI][BX] 

     以下指令中,目的操作数採用基址加变址寻址,引用的段寄存器是DS。

     MOV DS :[BP + SI], AL

     以下指令中,源操作数採用基址加变址寻址。引用的段寄存器ES。

     MOV AX , ES :[BX + SI]

      这样的寻址方式适用于处理数据或表格。用基址寄存器存放数组首地址,而用变址寄存器来定位数组中的各元素

    或反之。

     因为两个寄存器都可改变,所以能更加灵活地訪问数组或表格中的元素。

    7.相对基址加变址寻址方式

     操作数在存储器中,操作数的有效地址是由:

     基址寄存器之中的一个的内容与变址寄存器之中的一个的内容

     及指令中给定的8位或16位位移量相加得到。

     即:

     

     在普通情况下,假设BP之内容作为有效地址的一部分。那么引用的段寄存器是SS;否者以DS之内容为段值。

     在指令中给定的8位或16位位移量採用补码形式表示。

    在计算机有效地址时。假设位移量是8位。那么被带符号扩展成16位。

    当所取得的有效地址超过FFFFH是,就取64K的模。

    比如:假设(DS)=5000H。(BX)=1223H。(DI)=54H

     (51275)=54H,(51276)=76H

                MOV AX, [BX + DI -2]

     那么。存取的物理存储单元是多少呢?

     物理地址 = 50000 + 1223 + 0054 + FFFFE

                   = 51275H

     在运行该指令后。(AX) =7654H。注意解算过程中的符号扩展

     相对基址加变址这样的寻址方式的表示方法多种多样,以下四种表示方法均是等价的:

     MOV AX , [BX + DI + 1234H]

     MOVAX , 1234H[BX][DI]

     MOVAX , 1234H[BX + DI]

     MOVAX , 1234H[DI][BX]

    练习:

    1.现有(DS)=2000H,(BX)=0100H, (SI)=0002H

      (20100)=12H,(20101)=34H, (20102)=56H

      (20103)=78H,(21200)=2AH, (21201)=4CH

      (21202)=B7H,(21203)=65H

      试说明下列各条指令运行完后AX寄存器的内容。

       (1) MOV AX , 1200H 

       (2) MOV AX , BX

       (3) MOV AX , [1200H]

       (4) MOV AX , [BX]

       (5) MOV AX , 1100[BX]

       (6) MOV AX , [BX][SI]

       (7) MOV AX , 1100[BX][SI]

     

    1.答案(我自己写,看文章的朋友最好,自己如今记事本中练习一下。光看答案没有什么意思,而且,我的理解不一定对)

     (1) MOV AX , 1200H 

        这里是马上数寻址。 AX=1200H

     

    (2) MOV AX , BX

        这里是寄存器寻址,AX=BX=0100H

     

     (3) MOV AX , [1200H]

        这里是直接寻址,须要考虑段的值,段要左移动一位

    AX=[DS+1200H]=[20000+1200H]=2AH

     

    (4) MOV AX , [BX]

    这是寄存器间接寻址 ,须要考虑段

    AX=[DS+BX]=[20000+0100H]=12H

     (5) MOV AX , 1100[BX]

    这是寄存器相对寻址方式。要考虑段

    AX=[DS+BX+1100H]=[20000+0100H+1100H]=2AH

     (6) MOV AX , [BX][SI]

    这是基址+变址寻址方式,要考虑段

    AX=[DS+BX+SI]=[20000+0100H+0002H]=56H

    (7) MOV AX , 1100[BX][SI]

    这是相对基址+变址寻址,要考虑段

    AX=[DS+BX+SI+1100H]=[20000H+0100H+0002H+1100H]

    =[21202H]=B7H

    2.如果(DS)=2000H,(ES)=2100H, (SS)=1500H,

      (SI)=00A0H,(BX)=0100H,(BP)=0010H,

      数据段中变量名VAL的偏移地址值为0050H,

      试指出下列源操作数字段的寻址方式是什么?其物理地址值是多少?

       (1) MOV AX , 0ABH

       (2) MOV AX , BX

       (3) MOV AX , [100H]

       (4) MOV AX , VAL

       (5) MOV AX , [BX]

       (6) MOV AX , ES : [BX]

       (7) MOV AX , [BP]

      (8) MOV AX , [SI]

    2 答案,同上,自己写,看官,还是自己再笔记本上练习,然后我们对比,以为。我写的不一定对。

      (1) MOV AX , 0ABH

    这是马上数寻址,AX=0ABH

     

       (2) MOV AX , BX

    这是寄存器寻址,AX=BX=0100H

     

       (3) MOV AX , [100H]

    这是直接寻址,AX=[DS+100H]=[20100H]

     

       (4) MOV AX , VAL

        这是直接寻址,AX=[DS+VAL]=[20000+0050H]

       (5) MOV AX , [BX]

       这里是寄存器相对寻址。AX=[DS+BX]=[20000H+0100H]=[20100H]

       (6) MOV AX , ES : [BX]

        这是寄存器相对寻址 AX=[ES+BX]=[21000H+0100H]=[21100H]

       (7) MOV AX , [BP]

    这是寄存器相对寻址 AX=[SS+BP]=[15000H+0010H]=

    [15010H]

      (8) MOV AX , [SI]

          这里是寄存器相对寻址 AX=[DS+SI]=[20000H+00A0H]=[200A0H]

     (9) MOV AX , [BX + 10]

    这里是寄存器相对寻址

    AX=[DS+BX+10H]=[20000H+0100H+10H]=[20110H]

       (10) MOV AX , VAL[BX]

    这里是寄存器相对寻址

    AX=[DS+BX+VAL]=[20000H+0100H+0050H]=[20150H]

       (11) MOV AX , [BX][SI]

    这里是基址+变址寻址

    AX=[DS+BX+SI]=[20000H+0100H+0010H]=[20110H]

       (12) MOV AX , VAL [BX][SI]

    这里是相对基址+变址寻址

    AX=[DS+BX+SI+VAL]=[20000H+0100H+0010H+0050H]

    =[20160H]

    除了这7中主要的寻址方式外。8086/8088还提供了4种基于转移地址的寻址方式(第一个为段内,第二个为段间):

     

    (DS)=2000H,(CS)=6000H,(SS)=8000H,(ES)=A000H

       (BX)=1256H,位移量TABLE=20A1H,(232F7H)=3280H

      (1)JMP BX

      运行后。(IP)=1256H,

      下一条指令的物理地址是:6000(0) +1256 = 61256H

      (2)JMP TABLE[BX]

      运行后,(IP)=(2000(0) + (BX) + 位移量)

      =(20000 + 1256 + 20A1)

      =(232F7)

      =3280H

      下一条指令的物理地址是:6000(0)+3280=63280H

     

    汇编语言程序经翻译转换为机器语言程序,并且相互之间存在映射关系。

      例:ADD CL , BH

      机器语言为:00000010   11001111

      从左到右開始,各位的意义是:

      000000:OP(操作)

      1:reg为目的操作数

      0:字节操作

      11:寄存器方式

      001:reg , CL

      111:r/m , BH

     

    指令的运行是须要时间的

      一条指令的运行时间是取指令、取操作数、运行指令及传送结果各个阶段所需时间的总和。

      不同的指令的运行时间区别可能会非常大。

      同一种指令使用不同寻址方式时运行时间相差也可能会非常大。





     



     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     



     

     

     

  • 相关阅读:
    深入理解加密、解密、数字签名和数字证书
    支付网关的设计
    spring boot Rabbitmq集成,延时消息队列实现
    五一之起一台服务器玩玩-u盘安装centos
    shell初识
    用户身份切换之初窥企业远程用户没root还有root权限
    man帮助文档打印
    开源镜像软件下载网址{转载}
    bash shell第一课
    jQuery常用ajax操作
  • 原文地址:https://www.cnblogs.com/jhcelue/p/7149552.html
Copyright © 2020-2023  润新知