最近我读过一本书,它提到"段寄存器的值必须首先乘以16"
例如,MOV AL, [ES:BX]
表示移动ES * 16 + BX的内容以注册AL 。我也在网上搜索过一些类似的东西:
我只是想知道为什么16在这里? 16意味着什么?
更新
MOV BX, 16
和MOV ES, 1
的工作原理是一样的吗?这对我来说很奇怪。我认为ES是最左边的位,如果ES是1,那么地址是ES*65536+BX
... 答案 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