概述
前言
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段偏移的计算所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复