8086段偏移的计算

前言

8086一共20根地址线,用16bit的段地址 + 4bit偏移来寻址物理地址.
同一个物理地址可以用多个逻辑地址(不同的段地址+偏移)表示

测试程序

// testcase1.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <stdlib.h>
#include <stdio.h>
#include <assert.h>

// 根据段和偏移算物理地址
long Get8086PhAddr(/*IN*/ int iSegment, /*IN*/ int iOffset);

// 根据物理地址和偏移得到段地址
int Get8086Segment(/*IN*/ long lPhAddr, /*IN*/ int iOffset);

// 根据物理地址和段地址得到偏移
int Get8086Offset(/*IN*/ long lPhAddr, /*IN*/ int iSegment);

int main(int argc, char* argv[])
{
    long lTmp = 0;
    long lPhAddr = 0;
    int iSegment = 0;
    int iOffset = 0;

    // -d 123:456
    lPhAddr = Get8086PhAddr(0x123, 0x456);
    printf("0x%X = 123:456\n", lPhAddr);

    // -d ? : 186
    iSegment = Get8086Segment(lPhAddr, 0x186);
    lTmp = Get8086PhAddr(iSegment, 0x186);
    assert(lPhAddr == lTmp);
    printf("0x%X = %X:186\n", lTmp, iSegment);

    // -d 105:?
    iOffset = Get8086Offset(lPhAddr, 0x105);
    lTmp = Get8086PhAddr(0x105, iOffset);
    assert(lPhAddr == lTmp);
    printf("0x%X = 105:%X\n", lTmp, iOffset);

    /*
    run result
    0x1686 = 123:456
    0x1686 = 150:186
    0x1686 = 105:636
    请按任意键继续. . .

    用debug验证, 以下方式内存结果相同, 说明一个物理地址可以用多个逻辑地址表示
    -d 123:456
    -d 150:186
    -d 105:636
    -d 0:1686
    */

    system("pause");
    return 0;
}

long Get8086PhAddr(/*IN*/ int iSegment, /*IN*/ int iOffset) {
    return ((long)iSegment << 4) + iOffset;
}

int Get8086Segment(/*IN*/ long lPhAddr, /*IN*/ int iOffset) {
    return ((lPhAddr - iOffset) >> 4);
}

int Get8086Offset(/*IN*/ long lPhAddr, /*IN*/ int iSegment) {
    return lPhAddr - ((long)iSegment << 4);
}

验证

这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值