欢迎来到我的技术博客! 🎉
这里不仅有满满的编程干货和学习资源,我的某站账号也为你准备了更多实用的技术视频和知识分享。
👉 点击关注我的小破站账号,获取更多编程技巧和学习资源!
小破站主页
先看例题
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
。