繁体   English   中英

24位地址和24位算术与24位地址与16位地址的地址算术之间的区别?

[英]Difference between 24bit addresses and 24bit arithmetic vs 24 bit address with address arithmetic of 16 bit address?

我在 c167 Dokumentation 中找到了关于指针算术的注释。 有两个宏 _huge 和 _shuge。

来自 Doku 的引用:

_huge 或 _shuge。 巨大的数据可能在 memory 的任何地方,你可以

也使用 24 位地址引用它。 但是,地址算术是

使用完整地址(24 位)完成。 舒格数据也可能是

memory 中的任何位置,您也可以使用 24 位地址引用它。

但是,地址算术是使用 16 位地址完成的。

那么 _huge 和 _shuge 的用法有什么区别呢? 在我的理解中,指针的算术是使用起始地址的偏移量

到目前为止我所理解的示例:

&a[0] + 1 其中 a 的一个元素是 int32 &a[0] 给我第一个元素的地址,例如,这将等于 0x1234211 + 32Bit。**

考虑到上面的注释有什么不同吗? _huge 和 _shuge 有什么区别?

此致

It's obliquely explained on the 17th page (labeled as page 7) of this PDF: https://www.tasking.com/support/c166/c166_user_guide_v4.0.pdf

默认情况下,所有 __far 指针算法都是 14 位的。 这意味着 __far 指针的比较也是在 14 位中完成的。 对于 __shuge 也是如此,但随后使用 16 位算术。这显着节省了代码,但具有以下含义:

• 比较指向不同对象的指针是不可靠的。 仅当知道这些对象位于同一页面中时才可靠。

• 与 NULL 比较不可靠。 位于偏移量 0x0000 的另一个页面中的对象的低 14 位(页面偏移量)为零,并且也将被评估为 NULL。

换句话说, _shuge指针的最低 16 位以上的位将被忽略,除非取消引用它们。 您可能还注意到_shuge指针具有 16 位 alignment,这意味着它们的最低 4 位始终为零,因此在比较或减法时只需要考虑 12 位。

Huge 用于(好?)旧的 8086 家庭模式寻址。 这些是带有 24 位地址总线的 16 位处理器。 完整地址由段(16 位)地址和偏移量(同样为 16 位)给出,公式如下:

linear_address = segment * 16 + offset

2 个_huge地址之间的差异是通过首先将两者都转换为 24 位线性地址并减去该值来计算的,而对于_shuge一个,段和偏移量分别减去。

示例 0010:1236 - 0011:1234 将给出 0000:0012 (18) 如果计算为_huge0001:0002作为_shuge

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM