Intel 8086中给定物理地址如何求解段:偏移组合及偏移位数疑问
Intel 8086 物理地址转段:偏移组合的方法及偏移量位数说明
一、如何找出所有可能的段:偏移组合
8086的物理地址核心计算公式为:物理地址 = 段地址 × 16 + 偏移地址
换种说法就是,段地址左移4位(十六进制等价于末尾加一个0)后,加上偏移地址得到最终物理地址。
给定物理地址PA(十六进制),推导所有合法(段地址S, 偏移地址O)组合的步骤如下:
- 把公式变形为:
O = PA - S × 16 - 偏移地址O必须是16位无符号数,取值范围固定为
0000H ~ FFFFH,由此反推出段地址S的合法范围:- 最小段地址:
S_min = (PA - 0FFFFH) ÷ 16(向上取整,保证O不为负数) - 最大段地址:
S_max = PA ÷ 16(向下取整,保证O不超过FFFFH)
- 最小段地址:
- 只要S落在
S_min到S_max区间内(包含边界),对应的O就会是合法的16位偏移,每一个这样的S都对应一组有效组合。
实例验证(以PA=5F173H为例)
- 最大段地址S:
5F173H ÷ 16 = 5F17H(十六进制右移4位),此时O=5F173H - 5F17H×16 = 5F173H - 5F170H = 0003H,也就是你看到的(5F17, 3)(省略前导零的简写形式)。 - 任选一个合法区间内的S,比如
S=578DH:
S×16=578DH×16=578D0H,O=5F173H - 578D0H=78A3H,这就得到了组合(578D, 78A3)。
二、偏移量是否始终以16位表示?
是的,8086的偏移地址本质上都是16位——因为所有涉及偏移的寄存器(如IP、SP、BX、SI等)都是16位宽度。
你看到的“8位偏移”只是十六进制的简写:比如3H实际是0003H,0EH实际是000EH,只是省略了前导零,并非真的是8位数据。在8086架构中,偏移地址永远是16位无符号数,取值范围固定为0000H ~ FFFFH。
内容的提问来源于stack exchange,提问作者rayyya
相关产品推荐
相关产品推荐

