【发布时间】:2017-03-07 01:01:00
【问题描述】:
最近看了一本书,里面提到“段寄存器的值必须先乘以16”。
例如MOV AL, [ES:BX]表示将ES*16+BX的内容移动到寄存器AL。而且我在网上搜索了一些文章,也提到了这样的事情:
- https://www.quora.com/What-is-the-use-of-the-stack-segment-and-the-extra-segment-in-8086#
- Physical address calculation assembly IAPX8088
我只是想知道为什么 16 在这里? 16 是什么意思?
更新:
- 我的意思是,如果我想访问地址 16,
MOV BX, 16和MOV ES, 1都一样吗?这对我来说很奇怪。我以为ES是最左边的位,如果ES是1,那么地址就是ES*65536+BX...
【问题讨论】:
-
为什么是 16?因为这就是芯片的设计方式。
-
所以这只是一个公式,我不需要,为什么?只记得没关系吗?
-
20 位地址总线是设计目标。封装无疑起了很大的作用,他们不敢制造超过 40 个引脚的芯片。一兆字节在当时是巨大,它确实持续了超过 15 年。
-
@HansPassant:不清楚为什么他们没有使段移位 8 (
ES*256 + BX),但仍然只构建了具有 20 位物理寻址的芯片。这意味着在 CPU 的初始模型中,段寄存器的前 4 位将被忽略(或必须全为零),但会给它增加 16 倍的空间。是否能够将段与此类重叠细粒度控制真的有用吗?还是不想设计一个逻辑地址空间大于物理支持的芯片? -
重叠对于处理超过 64KB 的数据(“巨大”指针)很有用。乘数越小,在段大小粒度上浪费的地址空间就越少,使用大指针可以寻址的内存就越多。因此,它与获得 1 MB 地址空间所需的大小一样大。
标签: assembly