【发布时间】:2013-09-21 04:05:06
【问题描述】:
我刚开始阅读有关 intel 8086 的信息,并且对它的内存有疑问。
我读到地址总线是20位宽的,也就是说地址空间是1MB,这个空间被分割成段。
问题是:
-
四个段寄存器
CS、DS、SS和ES,它们是只读的还是我可以设置它们的值,它们的默认值是什么? -
我看到了下面的组装教程:
ORG 100h MOV AX, 0B800h ; set AX = B800h (VGA memory). MOV DS, AX ; copy value of AX to DS. MOV CL, 'A' ; CL = 41h (ASCII code). MOV CH, 01011111b ; CL = color attribute. MOV BX, 15Eh ; BX = position on screen. MOV [BX], CX ; w.[0B800h:015Eh] = CX. RET
关于第一行,这是否意味着这段代码将存在于代码段空间或整个地址空间中的地址0x100中
还有一行:
MOV [BX], CX
这是否意味着每次我在MOV 指令中引用一个地址时,该地址都应该从数据段的起始地址开始估算? (正如他所写,目的地是数据段reg中的值+值)
【问题讨论】:
-
...目的地是值+数据段reg中的值。这是不正确的。应该是,...目的地是值+数据段reg中的值乘以16。 20 位地址来自 16 位偏移加上 16 位段寄存器左移 4 位。
-
它们是处理超过 2**16 字节的笨拙方法,几乎没有理论意义,编码痛苦,在这一点上,只有微弱的历史意义。一个更有趣的问题是,“80x86-32 位段寄存器呢?”那有一个从未被使用过的有趣的“理论”应用程序。见stackoverflow.com/a/10810340/120163
-
我从未发现它们会导致“很多编码痛苦”。计算您需要的数据段并根据需要加载寄存器并不难。此外,只有在处理大数据时才需要它。