前言
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);
}
验证