精华内容
下载资源
问答
  • 直接寻址、间接寻址、立即寻址

    万次阅读 多人点赞 2018-06-01 11:38:56
    一、前言 直接寻址、间接寻址、立即寻址,只是CPU在通过总线与内存交互时的不同交互方法,而产生的三种概念词!对于这些寻址方式,很多人没有听说过,但是对于学习汇编的同学来说,非常熟悉,很多书中都有提到过这几...

    一、前言

        直接寻址、间接寻址、立即寻址,只是CPU在通过总线与内存交互时的不同交互方法,而产生的三种概念词!

    对于这些寻址方式,很多人没有听说过,但是对于学习汇编的同学来说,非常熟悉,很多书中都有提到过这几种寻址方式,但是没有细说,这里来给大家详细介绍一下这三种寻址方式的不同体现在哪里!

    二、直接寻址

        直接寻址即直接给出内存单元的物理地址/虚拟地址直接寻址!

    详细说一下:

    假如有一个内存,且大小是:0x00000000~0xFFFFFFFF

    每个物理地址代表一个内存单元(这里抛开虚拟内存管理机制),那么我想要取得0x00000001地址里的数据,首先CPU需要通过地址总线找到该内存单元,然后通过控制总线确定操作方法,在通过数据总线将其数据送回来,便于处理!

    那么我们要怎样将地址给CPU呢?

    答:

    放到CS段地址寄存器中,CS寄存器负责保存段地址,CPU会根据此段地址,去内存中将指令读取到CS:IP寄存器当中,然后执行!

    假如我想要将0x00000001地址里的数据取出来,放到AX寄存器当中,那么需要在内存中写好指定代码:

    MOVE AX,[DS:0x00000001H]

    MOVE AX,[0x00000001H]

    (AX内存=DS+0x00000001H)

     

    DS是段寄存器,这里无需多说,详细介绍可以看这篇文章:C语言内存模型详细介绍_堆栈介绍

     

    操作系统会自动帮我们把CS:IR寄存器指向我们的代码段,当CPU将指令取到CS:IP寄存器以后,就会通过CU控制单元译码解析指令转换成对应的电平信号,驱动CPU晶体管工作!

    CPU会直接将段地址+0x00000001的物理地址通过北桥,传送给内存芯片,内存芯片会把该地址里的数据取回来传递给CPU,当CPU接受到返回来的数据时,会把该数据写入到AX寄存器,这样一个指令就执行完成了,实际上并不是一个指令,其实CPU要分好几次时钟周期来执行,第一次去将DS寄存器里的段首地址读取出来,第二次加上0x00000001,第三次去内存中取数据,第四次将获取到的数据写入到AX中,即四个个时钟周期来完成一个指令,其中还会用到alu运算单元来进行段地址+偏移地址的运算,所以实际上可能需要多个时钟周期来完成!

    CPU是由晶体管来驱动的,每次开关驱动一次都称为一次时钟周期,时间周长不算,一般用赫兹来表示时钟周期的单位!

    上面的过程仅一步到位非常之快,因为我们直接给出了实际物理地址!

    下面来说说间接寻址

    三、间接寻址

    间接寻址是建立在直接寻址之上的一种概念,地址不是直接寻址那样直接给出,而是通过某个特定的内存单元得出,第一次是得到某个特定内存单元里的地址数据,第二次在将得出的地址进行DS+偏移地址H的运算直接寻址!

    这样说可能有点含糊不清,不过来看一下这段汇编代码,你就应该能明白直接寻址与间接寻址之间的区别了:

    MOV esp,0x00000001
    MOV AX,[esp]

    esp、eax等寄存器均为8086寻址寄存器,用于暂时存放地址的,并且寻址时也是以DS+esp的方式!

    其实esp和eax等e开头的寄存器和AX,BX,CX通用寄存器的作用没有区别,只是CPU设计者,设计出这么多寄存器是为了方便区分,某些寄存器做某些事情,这样更加方便于统一和区分,你也可以使用BX来进行间接寻址,只要你在里面写上[],这个括号在汇编里表示寻址括号,如果你把bx用[]括起来,CPU会把BX里的内容当做地址看待!

    这样的话,CPU要做的工作可就很多了,首先要将0x00000001地址送入到esp里,在将esp里的地址取出来,然后通过DS+esp在去内存中寻址,在取回来放到AX中!

    所以间接寻址说的明白一点,就是通过寄存器得到要寻址的地址,然后在寻址,而非直接给出地址直接寻址!

     

    上面有个疑惑,就是直接寻址的地址是怎么来的?

    答:在内存中取出指令存入到IP寄存器时,这个地址就已经存放进去了,在IP寄存器的低位,直接寻址的地址是存放在指令中的,而不需要二次获取!

     

    其如果使用间接寻址,在8085系列的CPU设计出了R0,R1的寄存器,并且如果间接寻址使用@符号表示

    mov R0,0x00000001
    mov ax,@R0

    用于表示间接寻址,不过这种寻址方式更加少见了,因为自8086系列CPU出现以后,[]指令的出现,更加方便于寻址,并且直观性更强,但是还是可以使用上面这种方法寻址的,因为向前兼容(即新的东西兼容老的东西),只是不同架构的CPU编写方法不同,但意思都是一个样!

     

    三、立即寻址

     

    通过上面的了解,立即寻址就非常简单了,即立即数寻址!

    立即数即指令的一部分,平常我们所看到的编程语言当中:

    int a = 5;

    这样我们在栈中保存了一个数据5,但是它是有空间的,在汇编中对它寻址是这样的:

    比如a在栈中的偏移地址是0x135h

    mov ax,[135h]

    CPU会到135h的内存中根据位宽寻址,将值寻回来以后,放入到ax寄存器当中!

     

    立即数不同,立即数是不占任何空间的,它存在于代码段,是指令的一部分:

     

    mov ax,135H

    ax内容=135

    当这个指令执行完成之后内存被释放掉之后,我们下次想要找到这个内存空间是找不到的!

    立即寻址要快于其它寻址,因为它无需进行寻址!

     

    展开全文
  • 立即寻址,直接寻址,间接寻址

    万次阅读 多人点赞 2017-04-10 23:17:40
    立即寻址就是指令当中自带数据,直接读取,最快; 直接寻址就是指令中存放的是地址,直接解析这个地址; 间接寻址就只指令中存放的是地址的地址,或者是存放地址的寄存器,最慢。 ...
    立即寻址就是指令当中自带数据,直接读取,最快;
    直接寻址就是指令中存放的是地址,直接解析这个地址;
    间接寻址就只指令中存放的是地址的地址,或者是存放地址的寄存器,最慢。




    总共有14个16位寄存器,8个8位寄存器

     

    通用寄存器:

      数据寄存器:

      AH(8位)  AL(8位)  AX(16位)   (AX和AL又称累加器)

      BH(8位)  BL(8位)  BX(16位)   (BX又称基址寄存器,唯一作为存储器指针使用寄存器)  

      CH(8位)  CL(8位)  CX(16位)   (CX用于字符串操作,控制循环的次数,CL用于移位)

      DH(8位)  DL(8位)  DX(16位)   (DX一般用来做32位的乘除法时存放被除数或者保留余数)

     

      指针寄存器:

      SP 堆栈指针 (存放栈顶地址)

      BP 基址指针 (存放堆栈基址偏移)

     

      变址寄存器:主要用于存放某个存储单元地址的偏移,或某组存储单元开始地址的偏移,

      即作为存储器(短)指针使用。作为通用寄存器,它们可以保存16位算术逻辑运算中的操

      作数和运算结果,有时运算结果就是需要的存储单元地址的偏移.

     

      SI 源地址  (源变址寄存器)

      DI 目的地址 (目的变址寄存器)

      

    控制寄存器:

      IP 指令指针

      FLAG 标志寄存器

       ① 进位标志 CF,记录运算时最高有效位产生的进位值。

     ② 符号标志 SF,记录运算结果的符号。结果为负时置1,否则置0。

     ③ 零标志  ZF,运算结果为0时ZF位置1,否则置0。

     ④ 溢出标志 OF,在运算过程中,如操作数超出了机器可表示数的范围称为溢出。溢出时OF位置1,否则置0。

     ⑤ 辅助进位标志 AF,记录运算时第3位(半个字节)产生的进位值。

     ⑥ 奇偶标志 PF,用来为机器中传送信息时可能产生的代码出错情况提供检验条件。当结果操作数中1的个数为偶数时置1,否则置0。

     

    段寄存器

      CS 代码段  IP

      DS 数据段  

      SS 堆栈段  SP BP

      ES 附加段

     

    七种寻址方式:

    1、立即寻址方式:

    操作数就包含在指令中。作为指令的一部分,跟在操作码后存放在代码段。

    这种操作数成为立即数。立即数可以是8位的,也可以是16位的。

    例如:

        指令: MOV AX,1234H

          则: AX = 1234H

     

    2、寄存器寻址方式:

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

    对于16位操作数,寄存器可以是:AX、BX、CX、DX、SI、DI、SP和BP等。

    对于8位操作数,寄存器可以是AL 、AH、BL、BH、CL、CH、DL、DH。

    这种寻址方式由于操作数就在寄存器中,不需要访问存储器来取得操作数

    因而可以取得较高的运算数度。

     

    3、直接寻址方式:

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

    注:操作数一般存放在数据段

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

    段超越前缀,则操作数也可含在数据段外的其他段中。

    例如:

    MOV AX,[8054]

    如(DS) = 2000H,

    则执行结果为(AX) = 3050H

    (物理地址=20000+8054=28054H)

    28054H里的内容为3050H

     

    在汇编语言指令中,可以用符号地址代替数值地址

    如:MOV AX,VALUE

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

    如写成:MOV AX,[VALUE]也是可以的,两者是等效的。

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

    MOV AX,ES:VALUE 或 MOV AX,ES:[VALUE]

     

    4、寄存器间接寻址方式:

    操作数在寄存器中,操作数有效地址在SI、DI、BX、BP

    这四个寄存器之一中。在一般情况下,如果有效地址在

    SI、DI和BX中,则以DS段寄存器中的内容为段值。如果

    有效地址在BP中,则以SS段寄存器中的内容为段值

    例如:

    MOV AX,[SI]

    如果(DS) = 5000H (SI) = 1234H

    则物理地址 =  50000 + 1234 = 51234H

    51234H地址中的内容为:6789H

    执行该指令后,(AX) = 6789H

     

    5、寄存器相对寻址方式:

    操作数在存储器中,操作数的有效地址是一个基址寄存器(BX、BP)

    或变址寄存器(SI、DI)的内容加上指令中给定的8位或16位位移量之和

     

        BX  8位 位移量

    EA(有效地址) =  BP  + 

        SI  16位 位移量

        DI

    在一般情况下,如果SI、DI、或BX中的内容作为有效地址的一部分,那么

    引用的段寄存器是DS;如果BP中的内容作为有效地址的一部分,那么引用的

    段寄存器是SS。

     

    物理地址 = 16d × (DS) + (BX) + 8

               或(SI)或16位位移量

               或(DI)

    物理地址 = 16d × (SS) + (BP) + 8位位移量

                           或16位位移量

    在指令中给定的8位或16位位移量采用补码形式表示。在计算有效地址时,如

    位移量是8位,则被带符号扩展成16位。

    例如:

    MOV AX,[DI+1223H]

    假设,(DS) = 5000H,(DI) = 3678H

    则物理地址 = 50000 + 3678 + 1233 = 5489BH

    5489BH地址中的内容:55AAH

    执行该指令后AX = 55AAH

    下面指令中,源操作数采用寄存器相对寻址,引用的段寄存器是SS: MOV BX,[BP-4]

    下面指令中,目的操作数采用寄存器相对寻址,引用的段寄存器是ES: MOV ES:[BX+5],AL

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

     

    6、基址加变址寻址方式:

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

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

       BX   SI

    即: EA =    + 

       BP   DI

    在一般情况下,如果BP之内容作为有效地址的一部分,则以SS之内容为段值,否则已DS

    为段值。

    例如:

    MOV AX,[BX][DI]

    如:(DS)=2100H,

       (BX)=0158H,

       (DI)=10A5H

    则EA=0158 + 10A5 = 11FD

    物理地址=21000 + 11FD = 221FDH

    221FDH地址中的内容:1234H

    执行该指令后AX = 1234H

     

    下面指令中,目的操作数采用基址加变址寻址,

    引用的段寄存器是DS: MOV DS:[BP+SI],AL

     

    下面指令中,源操作数采用基址加变址寻址,

    引用的段寄存器ES: MOV AX,ES:[BX+SI]

     

    这种寻址方式使用与数组或表格处理。用基址寄存器存放数组首地址,而用变地寄存器

    来定位数组中的各元素,或反之。由于两个寄存器都可改变,所以能更加灵活地访问数

    组或表格中的元素。

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

    MOV AX,[BX+DI]

    MOV AX,[DI][BX]

     

    7、相对基址加变址寻址方式:

    操作数在存储器中,操作数的有效地址由于基址寄存器之一的内容与变址寄存器之一的

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

             BX    SI    8位

    即: EA =     +     +      位移量

       BP    DI    16位

    在一般情况下,如果BP中的内容作为有效地址的一部分,则以SS段寄存器中的内容为段

    值,否则以DS段寄存器中的内容为段值。

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

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

    当所得的有效地址操作FFFFH时,就取其64K的模

    例如:

    MOV AX,[BX+DI-2]

    假设,(DS) = 5000H, (BX) = 1223H, DI = 54H, (51275) = 54H, (51276) = 76H

    物理地址= 50000 + 1223 + 0054 + FFFE(-2 各位取反末位加一) = 51275H

    执行该指令后 (AX) = 7654H

     

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

    MOV AX,[BX+DI+1234H], MOV AX,1234H[BX][DI]

    MOV AX 1234H[BX+DI],  MOV AX,1234H[DI][BX]


    展开全文
  • 立即寻址方式

    2019-07-30 10:06:04
    立即寻址方式所提供的操作数紧跟在操作码的后面,与操作码一起放在指令代码段中。立即数可以是8位无符号整数或16位无符号整数,但不可以是小数。如果是16位数,则低位字节存放在低地址中,高位字节存放在高地址中。 ...

    立即寻址方式所提供的操作数紧跟在操作码的后面,与操作码一起放在指令代码段中。立即数可以是8位无符号整数或16位无符号整数,但不可以是小数。如果是16位数,则低位字节存放在低地址中,高位字节存放在高地址中。

    立即寻址方式只能用于源操作数字段,不能用于目的操作数字段,经常用于给寄存器赋初值。
    例:MOV AX,251 ;将十进制数251送入寄存器AX,“251”是立即数
    MOV AL,‘5’ ;将5的ASCII码送入寄存器AL,‘5’是立即数
    MOV AL,E8H ;将8位立即数E8H送入寄存器AL
    MOV AX,2346H ;将16位立即数2346H送入寄存器AX

    立即数寻址方式主要用来给寄存器或存储单元赋值,因此这种寻址方式不能用于单操作数指令;若用于双操作数指令,也只能用于源操作数字段,不能用于目标操作数字段。

    转自:百度百科

    展开全文
  • 七种寻址方式(立即寻址、寄存器寻址)

    万次阅读 多人点赞 2016-10-04 10:24:34
    七种寻址方式(立即寻址、寄存器寻址) 一、立即寻址方式 操作数作为指令的一部分而直接写在指令中,这种操作数称为立即数,这种寻址方式也就称为立即数寻址方式。 立即数可以是8位、16位或32位,该数值...

    本文转自:http://blog.csdn.net/hanchaoman/article/details/9187093

    七种寻址方式(立即寻址、寄存器寻址)

    一、立即寻址方式

    操作数作为指令的一部分而直接写在指令中,这种操作数称为立即数,这种寻址方式也就称为立即数寻址方式。

    立即数可以是8位、16位或32位,该数值紧跟在操作码之后。如果立即数为16位或32位,那么,它将按“高高低低”的原则进行存储。例如:

    MOV AH, 80H   ADD AX, 1234H   MOV ECX, 123456H
    MOV B1, 12H   MOV W1, 3456H   ADD D1, 32123456H

    其中:B1、W1和D1分别是字节、字和双字单元。

    以上指令中的第二操作数都是立即数,在汇编语言中,规定:立即数不能作为指令中的第二操作数。该规定与高级语言中“赋值语句的左边不能是常量”的规定相一致。

    立即数寻址方式通常用于对通用寄存器或内存单元赋初值。图是指令“MOV AX, 4576H”存储形式和执行示意图。

    二、寄存器寻址方式

      指令所要的操作数已存储在某寄存器中,或把目标操作数存入寄存器。把在指令中指出所使用寄存器(即:寄存器的助忆符)的寻址方式称为寄存器寻址方式。
    指令中可以引用的寄存器及其符号名称如下:
      8位寄存器有:AH、AL、BH、BL、CH、CL、DH和DL等;
      16位寄存器有:AX、BX、CX、DX、SI、DI、SP、BP和段寄存器等;
      32位寄存器有:EAX、EBX、ECX、EDX、ESI、EDI、ESP和EBP等。
    寄存器寻址方式是一种简单快捷的寻址方式,源和目的操作数都可以是寄存器。


    1、源操作数是寄存器寻址方式
      如:ADD VARD, EAX  ADD VARW, AX   MOV VARB, BH等。
      其中:VARD、VARW和VARB是双字,字和字节类型的内存变量。在第4章将会学到如何定义它们。


    2、目的操作数是寄存器寻址方式
      如:ADD BH, 78h    ADD AX, 1234h   MOV EBX, 12345678H等。


    3、源和目的操作数都是寄存器寻址方式
      如:MOV EAX, EBX   MOV AX, BX     MOV DH, BL等。


      由于指令所需的操作数已存储在寄存器中,或操作的结果存入寄存器,这样,在指令执行过程中,会减少读/写存储器单元的次数,所以,使用寄存器寻址方式的指令具有较快的执行速度。通常情况下,我们提倡在编写汇编语言程序时,应尽可能地使用寄存器寻址方式,但也不要把它绝对化。

    七种寻址方式(直接寻址方式)

    指令所要的操作数存放在内存中,在指令中直接给出该操作数的有效地址,这种寻址方式为直接寻址方式。

    在通常情况下,操作数存放在数据段中,所以,其物理地址将由数据段寄存器DS和指令中给出的有效地址直接形成,但如果使用段超越前缀,那么,操作数可存放在其它段。

    例:假设有指令:MOV BX, [1234H],在执行时,(DS)=2000H,内存单元21234H的值为5213H。问该指令执行后,BX的值是什么?

    解:根据直接寻址方式的寻址规则,把该指令的具体执行过程用下图来表示。

    从图中,可看出执行该指令要分三部分:
     
    由于1234H是一个直接地址,它紧跟在指令的操作码之后,随取指令而被读出;

    访问数据段的段寄存器是DS,所以,用DS的值和偏移量1234H相加,得存储单元的物理地址:21234H;

    取单元21234H的值5213H,并按“高高低低”的原则存入寄存器BX中。

    所以,在执行该指令后,BX的值就为5213H。
     

    由于数据段的段寄存器默认为DS,如果要指定访问其它段内的数据,可在指令中用段前缀的方式显式地书写出来。

    下面指令的目标操作数就是带有段前缀的直接寻址方式。

    MOV ES:[1000H], AX

    直接寻址方式常用于处理内存单元的数据,其操作数是内存变量的值,该寻址方式可在64K字节的段内进行寻址。

    注意:立即寻址方式和直接寻址方式的书写格式的不同,直接寻址的地址要写在括号“[”,“]”内。在程序中,直接地址通常用内存变量名来表示,如:MOV BX, VARW,其中,VARW是内存字变量。

    试比较下列指令中源操作数的寻址方式(VARW是内存字变量):
      MOV AX, 1234H MOV AX, [1234H] ;前者是立即寻址,后者是直接寻址 
      MOV AX, VARW MOV AX, [VARW] ;两者是等效的,均为直接寻址

    七种寻址方式(寄存器间接寻址方式)

    操作数在存储器中,操作数的有效地址用SI、DI、BX和BP等四个寄存器之一来指定,称这种寻址方式为寄存器间接寻址方式。该寻址方式物理地址的计算方法如下:



    寄存器间接寻址方式读取存储单元的原理如图所示。

    在不使用段超越前缀的情况下,有下列规定:

    若有效地址用SI、DI和BX等之一来指定,则其缺省的段寄存器为DS;
    若有效地址用BP来指定,则其缺省的段寄存器为SS(即:堆栈段)。

    例:假设有指令:MOV BX,[DI],在执行时,(DS)=1000H,(DI)=2345H,存储单元12345H的内容是4354H。问执行指令后,BX的值是什么?

    解:根据寄存器间接寻址方式的规则,在执行本例指令时,寄存器DI的值不是操作数,而是操作数的地址。该操作数的物理地址应由DS和DI的值形成,即: 

    PA=(DS)*16+DI=1000H*16+2345H=12345H。

    所以,该指令的执行效果是:把从物理地址为12345H开始的一个字的值传送给BX。

    其执行过程如图所示。


    七种寻址方式(寄存器相对寻址方式)

    操作数在存储器中,其有效地址是一个基址寄存器(BX、BP)或变址寄存器(SI、D

    I)的内容和指令中的8位/16位偏移量之和。其有效地址的计算公式如公式所示。

    在不使用段超越前缀的情况下,有下列规定:
     
        若有效地址用SI、DI和BX等之一来指定,则其缺省的段寄存器为DS;
     
        若有效地址用BP来指定,则其缺省的段寄存器为SS。
     
    指令中给出的8位/16位偏移量用补码表示。在计算有效地址时,如果偏移量是8位,则进行符号扩展成16位。当所得的有效地址超过0FFFFH,则取其64K的模。

    例:假设指令:MOV BX, [SI+100H],在执行它时,(DS)=1000H,(SI)=2345H,内存单元12445H的内容为2715H,问该指令执行后,BX的值是什么?

    解:根据寄存器相对寻址方式的规则,在执行本例指令时,源操作数的有效地址EA为:
     
    EA=(SI)+100H=2345H+100H=2445H
     
    该操作数的物理地址应由DS和EA的值形成,即:
     
    PA=(DS)*16+EA=1000H*16+2445H=12445H。

    所以,该指令的执行效果是:把从物理地址为12445H开始的一个字的值传送给BX。

    其执行过程如图所示。


    七种寻址方式(基址加变址寻址方式)

    操作数在存储器中,其有效地址是一个基址寄存器(BX、BP)和一个变址寄存器(SI、DI)的内容之和。其有效地址的计算公式如公式所示。

    在不使用段超越前缀的情况下,规定:如果有效地址中含有BP,则缺省的段寄存器为SS;否则,缺省的段寄存器为DS。

    例:假设指令:MOV BX, [BX+SI],在执行时,(DS)=1000H,(BX)=2100H,(SI)=0011H,内存单元12111H的内容为1234H。问该指令执行后,BX的值是什么?

    解:根据基址加变址寻址方式的规则,在执行本例指令时,源操作数的有效地址EA为:

    EA=(BX)+(SI)=2100H+0011H=2111H

    该操作数的物理地址应由DS和EA的值形成,即:

    PA=(DS)*16+EA=1000H*16+2111H=12111H

    所以,该指令的执行效果是:把从物理地址为12111H开始的一个字的值传送给BX。

    其执行过程如图所示。


     

     

    七种寻址方式(相对基址加变址寻址方式)

    操作数在存储器中,其有效地址是一个基址寄存器(BX、BP)的值、一个变址寄存器(SI、DI)的值和指令中的8位/16位偏移量之和。其有效地址的计算公式如公式所示。 

    在不使用段超越前缀的情况下,规定:如果有效地址中含有BP,则其缺省的段寄存器为SS;否则,其缺省的段寄存器为DS。

    指令中给出的8位/16位偏移量用补码表示。在计算有效地址时,如果偏移量是8位,则进行符号扩展成16位。当所得的有效地址超过0FFFFH,则取其64K的模。

    例:假设指令:MOV AX, [BX+SI+200H],在执行时,(DS)=1000H,(BX)=2100H,(SI)=0010H,内存单元12310H的内容为1234H。问该指令执行后,AX的值是什么?

    解:根据相对基址加变址寻址方式的规则,在执行本例指令时,源操作数的有效地址EA为:

    EA=(BX)+(SI)+200H=2100H+0010H+200H=2310H

    该操作数的物理地址应由DS和EA的值形成,即:

    PA=(DS)*16+EA=1000H*16+2310H=12310H

    所以,该指令的执行效果是:把从物理地址为12310H开始的一个字的值传送给AX。其执行过程如图所示。

    从相对基址加变址这种寻址方式来看,由于它的可变因素较多,看起来就显得复杂些,但正因为其可变因素多,它的灵活性也就很高。比如:
      
    用D1[i]来访问一维数组D1的第i个元素,它的寻址有一个自由度,用D2[i][j]来访问二维数组D2的第i行、第j列的元素,其寻址有二个自由度。多一个可变的量,其寻址方式的灵活度也就相应提高了。

    相对基址加变址寻址方式有多种等价的书写方式,下面的书写格式都是正确的,并且其寻址含义也是一致的。

    MOV AX, [BX+SI+1000H]   MOV AX, 1000H[BX+SI]
    MOV AX, 1000H[BX][SI]    MOV AX, 1000H[SI][BX]

    但书写格式BX [1000+SI]和SI[1000H+BX]等是错误的,即所用寄存器不能在“[“,”]”之外,该限制对寄存器相对寻址方式的书写也同样起作用。

    相对基址加变址寻址方式是以上7种寻址方式中最复杂的一种寻址方式,它可变形为其它类型的存储器寻址方式。下表列举出该寻址方式与其它寻址方式之间的变形关系。
    展开全文
  • 立即寻址就是指令当中自带数据,直接读取,最快;直接寻址就是指令中存放的是地址,直接解析这个地址;间接寻址就只指令中存放的是地址的地址,或者是存放地址的寄存器,最慢。总共有14个16位寄存器,8个8位寄存器...
  • 我们这次就来讨论一下立即寻址。 在立即寻址,操作数本身直接在指令中给出,取出指令也就获得了操作数,这个操作数也称为立即数。例子如下: ADD R0, R1, #5 ;R0=R1+5 MOV R0, #0x55 ;R0=0x55 在这两个例子中...
  • 在 80x86 汇编语言中,立即寻址和直接寻址的格式有些相似,区别就在于 [ ] 的有无。看看下面两行:MOV AX, 1000MOV AX, [1000]前一行,是立即寻址,是把 1000 这个数,送到 AX 中去;后一行,是直接...
  • 立即寻址有效数的计算 (一)ARM立即寻址的指令格式 (二)例1 汇编指令:mov R0, #0x00110000 转为机器码就是 机器码:0xe3a03811,其中0x811是ARM在机器码中用来表示立即数的部分 其中8对应上图的rot,11对应...
  • MCS-51的立即寻址方式中,立即数前面 _____________。 A.应加前缀“/:”号 B.不加前缀号 C.应加前缀“@”号 D.应加前缀“#”号
  • 直接寻址、间接寻址、立即寻址,只是CPU在通过总线与内存交互时的不同交互方法,而产生的三种概念词! 对于这些寻址方式,很多人没有听说过,但是对于学习汇编的同学来说,非常熟悉,很多书中都有提到过这几种寻址...
  • 直接寻址,指令中直接放地址: MOV A, 50H 把internal ram上,地址为80H单元里的数据送进A,假设80H地址里放的数据是01,那么最后A里的数据就是01 间接寻址,地址存于寄存器中 MOV A,@R0 R0中存放的是地址值,把这...
  • 概念: 寻址——找操作数 1,给出操作数; 2,直接按照给出数据为地址,寻址; 3,以给出数据为地址找到数据,再以找到的数据为地址,寻需要的操作数;...AX,10H,采用的是立即寻址方式,这条指令(包含操...
  • 寻址

    2018-05-27 15:54:25
    立即寻址:操作数以常量(立即数)的形式出现在指令中存储器寻址:1. 直接寻址:带方括号的常量或变量。2. 间接寻址:带方括号的寄存器寄存器相对寻址:在间接寻址的基础上和立即数做一个加法运算基址变址寻址:基址...
  • [汇编语言]立即寻址和寄存器寻址

    千次阅读 2018-11-25 19:41:45
    1. 什么是立即数? 操作数从指令代码中得到,即立即数(Immediate),也可以说就是指令的一部分了, 例如: MOV EAX 33221100H ;机器代码为 B8 00 11 22 33 ;操作码为 B8 ...立即寻址方式只用于源操作...
  • I/O端口寻址方式8086采用的是变字长指令格式,指令长度为1~6个字节,第一个字节包含操作码,第二个字节通常表示寻址方式,第三个到第六个字节表示位移量,立即数。1,寄存器寻址方式:指令所需的操作数在寄存器中,...
  • 2、指令寻址与数据寻址指令寻址思维导图顺序寻址跳跃寻址数据寻址直接寻址间接寻址寄存器寻址寄存器间接寻址隐含寻址立即寻址总结偏移寻址基址寻址变址寻址相对寻址堆栈寻址比较 指令寻址 思维导图 顺序寻址 由于...
  • 众所周知,对于8086汇编语言,有几大寻址方式,不过我觉得这个好墨迹,会用就可以了,为什么命名这么多,这次只说本质,不说命名,至于命名,还是得知道,毕竟是大部分人公认的,不能反抗这点哦,但是你知道,不代表...
  • 寻址方式

    2018-12-07 18:31:28
    立即寻址和其他的寻址方式不同,因为立即寻址的操作数(立即数)是由指令直接给出的,所以在编译的时候会和指令码一起被放在内存的代码段区里,当这条指令执行的时候,这个操作数就会被拿出来送给目标地址 ...
  • 数据寻址

    2020-07-27 10:15:43
    数据寻址 1.操作数类型 2.数据寻址 3.立即寻址 4.直接寻址 5.间接寻址 5.寄存器寻址 6.寄存器间接寻址 7.隐含寻址 8.总结
  • 数据寻址1

    2020-10-21 16:30:19
    数据寻址 立即寻址 直接寻址 间接寻址 寄存器寻址 隐含寻址 寻址总结

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,035
精华内容 414
关键字:

立即寻址