现在的位置: 首页 > 综合 > 正文

8086地址 ffff:ffff 和 0:ffef 回绕问题

2018年05月18日 ⁄ 综合 ⁄ 共 767字 ⁄ 字号 评论关闭

学汇编的孩子大概都疑惑过:8086CPU最大寻址为1MB = FFFFFH = FFFF:000F,可是为什么Debug中输入FFFF:FFFF合法而且有数据显示???

这就是8086CPU的地址回绕问题:

FFFF0   +   FFF0   =   10   FFE0

这样1最前面的1会出现溢出,从而实际地址应该是0FFE0

Dosbox:

上图证实了地址FFFF:FFF0回绕为0000:FFE0,那么为什么会产生地址回绕呢?

8086只有20根地址线,只能访问1M的地址空间。CPU寻址则按段+偏移的方式进行。16位段+16位偏移的可能的范围是0~0x10FFEF   

(即0xFFFF0+0xFFFF),即1M+65520字节的范围。由于只有20根地址线,所以在对1M~1M+65520范围进行访问时,会发生“地址回绕”

的现象,就是说实际会访问到0~65520的地方。据说某个著名的/臭名昭著的软件利用了这个特点

另外:有的童鞋Debug并不会产生地址回绕,也就是上面两行显示数据不一致,这是因为

我们使用的DOS(或者是XP、WIN7 32下的CMD),它们都是打开A20地址线的,也就是说 -d   ffff:fff0其显示的已经是10FFE0的地址的内容了

从80286起由于CPU的寻址实际已经超过了1M的限制,MICROSOFT的DOS就使用了一些技术来使用大于1M的内存,比如扩展内存技术和扩充内存

技术。如果使用DOS 6.22 可以尝试不加载HIMEM.SYS 和EMM386.EXE,然后再使用DEBUG,就可以看到想要的地址循环效果了。

补充:为了保持完全的兼容性,IBM决定在PC
AT系统上加个逻辑,来模仿以上的回绕特征。他们的方法就是把A20和键盘控制器的

一个输出进行AND,这样来控制A20的打开和关闭。一开始时A20是被屏蔽的(总为0),直到系统软件去打开它。

抱歉!评论已关闭.