我是靠谱客的博主 独特外套,最近开发中收集的这篇文章主要介绍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:456n", lPhAddr);

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

    // -d 105:?
    iOffset = Get8086Offset(lPhAddr, 0x105);
    lTmp = Get8086PhAddr(0x105, iOffset);
    assert(lPhAddr == lTmp);
    printf("0x%X = 105:%Xn", 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);
}

验证

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

最后

以上就是独特外套为你收集整理的8086段偏移的计算的全部内容,希望文章能够帮你解决8086段偏移的计算所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(50)

评论列表共有 0 条评论

立即
投稿
返回
顶部