8086段偏移的计算

来源:互联网 发布:杀毒软件哪个好 知乎 编辑:程序博客网 时间:2024/06/02 05:45

前言

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);}

验证

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

0 0