这取决于8086当初这种看似"奇怪"的设计,人家的设计就是这样的
我不是说了吗?人家处理器就是这么设计的.
内部地址中的高12位是全0吗?如果不是全0,在与段寄存器相加后,就有可能与其他段的内容相重叠啊。
我倒是能理解 段寄存器*16+偏移量 来形成 20位地址。
原帖由 c/unix 于 2008-11-30 16:16 发表 我不是这个意思啊。设计我能理解,比如CS:IP, 就是2个16位的地址形成一个20位的实地址。可是这个书作者的那句话为什么那么说呢,内部地址不就是保存在段寄存器里的吗,怎么又取高12位和段寄存器相加?
原帖由 c/unix 于 2008-11-30 16:16 发表
我不是这个意思啊。
设计我能理解,比如CS:IP, 就是2个16位的地址形成一个20位的实地址。
可是这个书作者的那句话为什么那么说呢,内部地址不就是保存在段寄存器里的吗,怎么又取高12位和段寄存器相加?
建议找原文对照一下,很多翻译比原文都难理解。
这个还是8086的思路
原帖由 c/unix 于 2008-11-30 16:08 发表 在看Linux内核分析,前面就卡住了,实地址模式是根据2个16位的寄存器得到一个20位地址,我没说错吧。可是下面这句话(画红线部分)该怎么理解呢:http://blog.chinaunix.net/photo/70442_0811301 ...
原帖由 c/unix 于 2008-11-30 16:08 发表 在看Linux内核分析,前面就卡住了,
实地址模式是根据2个16位的寄存器得到一个20位地址,我没说错吧。
可是下面这句话(画红线部分)该怎么理解呢:
http://blog.chinaunix.net/photo/70442_0811301 ...
他的意思是说:
假如:ds:[0001] = 1000:0001
0001 0000 0000 0000 = ds+ 0000 0000 0000 0001 = [0001] ==> '内部地址’的高12位与16位段寄存器相加,低4位不变---------------------------------------------------------------------- 0001 0000 0000 0000 0001 = 10001 (结果)
其实就等于 ds 左向移4位
这作者的水平真 TM 的烂~~~~~
这么简单的问题把它描述得这么复杂。
原帖由 mik 于 2008-12-1 14:51 发表 他的意思是说:假如:ds:[0001] = 1000:0001 0001 0000 0000 0000 = ds+ 0000 0000 0000 0001 = [0001] ==> '内部地址’的高 ...
原帖由 mik 于 2008-12-1 14:51 发表
0001 0000 0000 0000 = ds+ 0000 0000 0000 0001 = [0001] ==> '内部地址’的高 ...
还是看 datasheet 好,呵呵。
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
暂无简介
文章 0 评论 0
接受
发布评论
评论(6)
我不是说了吗?人家处理器就是这么设计的.
内部地址中的高12位是全0吗?如果不是全0,在与段寄存器相加后,就有可能与其他段的内容相重叠啊。
我倒是能理解 段寄存器*16+偏移量 来形成 20位地址。
建议找原文对照一下,很多翻译比原文都难理解。
这个还是8086的思路
他的意思是说:
假如:ds:[0001] = 1000:0001
0001 0000 0000 0000 = ds
+ 0000 0000 0000 0001 = [0001] ==> '内部地址’的高12位与16位段寄存器相加,低4位不变
----------------------------------------------------------------------
0001 0000 0000 0000 0001 = 10001 (结果)
其实就等于 ds 左向移4位
这作者的水平真 TM 的烂~~~~~
这么简单的问题把它描述得这么复杂。
还是看 datasheet 好,呵呵。