标签:相对 偏移地址 堆栈 内容 存储 情况下 指令 轻松 情况
偏移地址在指令中,操作数在内存中
MOV指令默认的操作数存储在DS中(数据段寄存器);此时采用段加偏移。
偏移地址在寄存器中,操作数在内存中
能够存储偏移地址的寄存器:BX、BP、SI、DI(此时用作数据寄存器)
在段寄存器没有指定的情况下,BP对应SS;BX、SI、DI对应DS。
比如: MOV AX, [BP] #源操作数的物理地址:SS*16 + BP
第二种情形的延申
比如: MOV AX, [BP+15H] #源操作数的物理地址:SS*16 + BP + 15H
基址加变址寻址方式
用一个基址寄存器(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
第四种情形的升级
基址加变址加相对寻址
比如:
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等)
以上两种情形,在指令中都不会出现[ ],因为[ ]表示,在内存里,而一旦与内存有关,就要考虑“段加偏移”。
内存(指令中必定有[ ]):
DS*16 + 514H
DS*16 + BX
DS*16 + BX + 514H
SS*16 + BP + DI
SS*16 + BP + DI + 514H
以上五种情况,在计算物理地址时都采用段加偏移的模式。
标签:相对 偏移地址 堆栈 内容 存储 情况下 指令 轻松 情况
原文地址:https://www.cnblogs.com/ZealYoung/p/10862757.html