先看例题
DS=3000H,ES=4000H,SS=5000H,BX=0300H,BP=0050H,SI=0200H计算下列指令中存储器类型操作数的物理地址。(1)MOV AL,[BP 5] (2)ADD AL,5[BX SI] (3)MOV BP,[2000H](4)ADD [BP][SI] 20H,AX并详细解释如何选择DS还是SS
要计算给定指令中的存储器类型操作数的物理地址,我们需要理解如何通过段寄存器和偏移寄存器来组合形成物理地址。通常,在8086微处理器中,物理地址由段寄存器内容乘以16,再加上偏移量来计算。具体地说:
- 段寄存器可以是:
DS
(数据段寄存器)、ES
(附加段寄存器)、SS
(栈段寄存器)等。 - 偏移寄存器可以是:
BX
、BP
、SI
、DI
等。
解释段选择规则
通常情况下:
- 使用SS段:如果操作数涉及BP寄存器,则默认使用
SS
作为段寄存器。 - 使用DS段:如果操作数不涉及
BP寄存器
,则默认使用DS
作为段寄存器。
接下来我们逐条分析并计算物理地址:
1. MOV AL,[BP 5]
- 段寄存器:由于BP寄存器参与计算,所以段寄存器为
SS
。 - 段基值:
SS = 5000H
- 偏移量:
BP 5 = 0050H 5 = 0055H
- 物理地址:
(SS * 16) (BP 5) = 5000H * 10H 0055H = 50000H 0055H = 50055H
因此,物理地址是50055H。
2. ADD AL,5[BX SI]
- 段寄存器:此操作数不涉及
BP
,因此段寄存器为DS
。 - 段基值:
DS = 3000H
- 偏移量:
BX SI 5 = 0300H 0200H 5 = 0505H
- 物理地址:
(DS * 16) (BX SI 5) = 3000H * 10H 0505H = 30000H 0505H = 30505H
因此,物理地址是30505H。
3. MOV BP,[2000H]
- 段寄存器:此指令中的偏移量是显式的(2000H),没有使用
BP
或其他偏移寄存器,所以段寄存器为默认的DS
。 - 段基值:
DS = 3000H
- 偏移量:
2000H
- 物理地址:
(DS * 16) 2000H = 3000H * 10H 2000H = 30000H 2000H = 32000H
因此,物理地址是32000H。
4. ADD [BP][SI] 20H,AX
- 段寄存器:因为涉及到
BP
寄存器,所以段寄存器为SS
。 - 段基值:
SS = 5000H
- 偏移量:
BP SI 20H = 0050H 0200H 20H = 0270H
- 物理地址:
(SS * 16) (BP SI 20H) = 5000H * 10H 0270H = 50000H 0270H = 50270H
因此,物理地址是50270H。
总结
- MOV AL,[BP 5]: 物理地址 = 50055H (使用
SS
) - ADD AL,5[BX SI]: 物理地址 = 30505H (使用
DS
) - MOV BP,[2000H]: 物理地址 = 32000H (使用
DS
) - ADD [BP][SI] 20H,AX: 物理地址 = 50270H (使用
SS
)
在计算物理地址时,选择DS
还是SS
的关键在于是否使用了BP
寄存器:如果使用BP
,则默认使用SS
;否则使用DS
。