为什么"段寄存器的值必须首先乘以16"?

时间:2016-10-25 05:43:32

标签: assembly

最近我读过一本书,它提到"段寄存器的值必须首先乘以16"

例如,MOV AL, [ES:BX]表示移动ES * 16 + BX的内容以注册AL 。我也在网上搜索过一些类似的东西:

  1. https://www.quora.com/What-is-the-use-of-the-stack-segment-and-the-extra-segment-in-8086#
  2. Physical address calculation assembly IAPX8088
  3. 我只是想知道为什么16在这里? 16意味着什么?

    更新

    1. 我的意思是,如果我想访问地址16,MOV BX, 16MOV ES, 1的工作原理是一样的吗?这对我来说很奇怪。我认为ES是最左边的位,如果ES是1,那么地址是ES*65536+BX ...

2 个答案:

答案 0 :(得分:3)

在分段存储器和16位地址空间的那一天,它允许你处理整个1 MB的内存,这是原始的8086支持(它有20位外部地址总线),仍然保持两个&# 34;邻近"指针和段寄存器16位宽。

 ssssssssssssssss0000 +    segment (16 bit) * 16 (= left shift 4)
 0000pppppppppppppppp =    near pointer (16 bit)
------------------------
xaaaaaaaaaaaaaaaaaaaa      physical address (20 bit + something)

(你实际上可以超过1 MB,大约64 KB,最初导致环绕,然后导致整个A20问题)

答案 1 :(得分:-1)

获取内存地址的过程是:
基本存储寄存器* 16 +相对存储寄存器。

例:
  [ds:si]
假设 DS 存储值700h且 SI 存储值7h,则指令将用作:
[700h:7h]
这将取消引用7007h(700h * 16 + 7h = 7007h)的记忆。

因此[700h:7h]与[7007h]相同。

为什么16 ?,十六进制数乘以16将与推左数相同:
700h * 16 = 7000h