计算机组成:解疑补漏之MOV指令与操作数寻址方式

MOV指令以及操作数的寻址方式

  1. 偏移地址在指令中,操作数在内存中
    MOV指令默认的操作数存储在DS中(数据段寄存器);此时采用段加偏移

  2. 偏移地址在寄存器中,操作数在内存中
    能够存储偏移地址的寄存器:BX、BP、SI、DI(此时用作数据寄存器)
    在段寄存器没有指定的情况下,BP对应SS;BX、SI、DI对应DS。
    比如: MOV AX, [BP] #源操作数的物理地址:SS*16 + BP

  3. 第二种情形的延申
    比如: MOV AX, [BP+15H] #源操作数的物理地址:SS*16 + BP + 15H

  4. 基址加变址寻址方式
    用一个基址寄存器(BX和BP)和一个变址寄存器(DI和SI)值,相加结果作为操作的偏移地址(SI源变址寄存器,DI目的变址寄存器);
    BP对应SS(因为BP本身就用于堆栈操作,所以对应SS堆栈段寄存器);
    BX对应DS(同样BX本身就是数据寄存器,所以对应DS数据段寄存器);
    比如:
    MOV AX, [BX+SI] #源操作数的物理地址:DS*16 + BX + SI
    MOV AX, [BP+DI] #源操作数的物理地址:SS*16 + BP + DI

  5. 第四种情形的升级
    基址加变址加相对寻址
    比如:
    MOV AX, [BX+SI+10H] #源操作数的物理地址:DS*16 + BX + SI + 10H
    MOV AX, [BP+DI+10H] #源操作数的物理地址:SS*16 + BP + DI + 10H

第四第五两种情形,都必须是一个基址加一个变址。

如此,就能很轻松解决下面的三道题了

设CS=2500H,DS=2400H,SS=2430H,BP=0200H,SI=0010H,DI=0206H,计算下列x86指令源操作数的物理地址。
MOV AX,[2000H] ?24000H + 2000H = 26000H√
MOV AX,[BP+SI+4] ?24300H + 0200H + 0010H + 4 = 24514H √
MOV AX,[DI+100H] ?24000H + 0206H + 100H = 24306H √

总结于下

操作数可能在的三个位置:指令、寄存器、内存;
指令:立即数寻址(直接给出立即数,也就是偏移量,像250H、'a'都可以作为理解数)
寄存器:寄存器寻址(指令中给出的是寄存器的名字,比如AX、BX、CX、DX、IP等)
以上两种情形,在指令中都不会出现[ ],因为[ ]表示,在内存里,而一旦与内存有关,就要考虑“段加偏移”。

内存(指令中必定有[ ]):

  • MOV AX, [514H] #直接寻址,内存的地址为立即数,实际物理地址:DS*16 + 514H
  • MOV AX, [BX] #寄存器间接寻址,内存地址在BX中(只能是这四个寄存器BX、BP、SI、DI,BP对应SS,其他三个对应DS),实际物理地址:DS*16 + BX
  • MOV AX, [BX+514H] #寄存器相对寻址,内存地址是BX内容再加上514H,(其中的寄存器只能是这四个BX、BP、SI、DI,BP对应SS,其他三个对应DS),实际物理地址:DS*16 + BX + 514H
  • MOV AX, [BP+DI] #基址变址寻址,必须是一个基址寄存器(BP或BX,对应段寄存器的关系和上面一样),然后加上变址寄存器(SI或DI)作为内存的地址,实际物理地址:SS*16 + BP + DI
  • MOV AX, [BP+DI+514H] #基址变址寻址,必须是一个基址寄存器(BP或BX,对应段寄存器的关系和上面一样),然后加上变址寄存器(SI或DI),实际物理地址:SS*16 + BP + DI + 514H

以上五种情况,在计算物理地址时都采用段加偏移的模式。

猜你喜欢

转载自www.cnblogs.com/ZealYoung/p/10862757.html
今日推荐