怎么办8位和16位处理器访问更大的内存有两个寄存器?(How do 8-bit and 16-bit

2019-07-04 10:09发布

一些一直困惑我的是8位计算机如何访问超过256个字节的RAM。 我知道,它必须使用两个寄存器,但任何一个可以告诉我的是什么,这将看起来像汇编代码的例子吗?

喜欢:

mov a, [x]   ???

Answer 1:

让我们想象一下,我们在寄存器L和H.例如地址的较低和较高的8位半,我们要读取的地址32770 DEC = 8002字节十六进制。

mov l, 02h  ;lower byte of address
mov h, 80h  ;higher byte of address
mov a, [hl] ;a <-- [h*256 + l]

多种寻址模式,在CPU的存在。 因此,我们可以有不同的例子,例如只是一个单一的寄存器和立即地址:

mov h, 80h
mov a, [2]  ;a <-- [h*256 + immediate]

它总是依赖于特定的CPU架构。 例如Zilog公司Z80被称为8位CPU,但它也包含了许多16位指令。 你可以做址寻址它是这样的:

mov ix, 8002h  ;base address of an array
mov a,[ix+20]  ;a <-- [ix + 20] i.e. read a byte from an array like ix[20] in C

注意:那些古老的8位CPU的使用8位累加器,也就是说,它们只能在8位寄存器计算数学和其他运算的东西,所以他们在一个软件计算级8位。 而他们的存储器访问单元为8位,即它可以阅读或在同一时间写的内存只是一个字节,所以他们都在硬件级8位太。 这些16位指令是缓慢的,实际上他们做一对8位操作的连续。



Answer 2:

让我们考虑8080(Z80等),它有8位寄存器,但能够配对寄存器像16位寄存器。 可能是最常用的一对为HL,为H代表的8个高位和L为地址的低8位。 其他寄存器对BC分别和DE - 再次,大部分的操作只用一个一对套准工作的时间,但也有少数可以使用对连同16位数量(例如,至少如果没有记错的工作,有一个DE添加到HL)。

一些指导也可以直接使用16位地址:

jmp 01234h

6502是那种同样的方式,但它限制某些指令与第一个256个字节的RAM(又名“页0”)工作。 后来的版本(65816?)做支持采摘将被视为0页,虽然不同的物理地址。



Answer 3:

有很多的技术来实现这一

英特尔8080是一个8位CPU,2个寄存器H和L为间接地址,从而允许其解决存储器的16位。 16位8086与分割20个地址。 80286使用24位地址与高16位段是一个索引段描述符表。 32位x86使用36个地址与PAE ...

PIC microcontrolers已在寄存器中的8位值合并在PC的高比特(或某些专用地址寄存器,因为我不记得),以形成13位地址(或更多,取决于结构)

在微控制器(某些微处理器架构)的另一种常见的方式是银行 ,在其中您更改“内存窗口”,该CPU可每次看到。

  • 英特尔8051具有4个寄存器库与常见的总是可见的,其他的可以由银行切换指令进行选择。 有些版本可以使用银行的代码的地址,将其扩展到代码2MBS。
  • DOS使用内存银行业EMS和XMS ,以便访问超过1MB或RAM更映射更高的内存较低的地址。
  • 32位Windows使用地址窗口扩展在PAE模式,以允许32位进程访问大于2GB的RAM更

欲了解更多信息,你可以在这里阅读



Answer 4:

6502已经索引内存读取指令lda $01200,Ylda $1413,X ,其中16位地址编码为指令的一部分。 在任何时候,那种指令看到的256个字节的窗口。 为了访问下一个256个字节的指令本身被修改为lda $1300,Y例如。

然后8086已分段的结构,其中每一个存储器存取加上隐式或显式的段寄存器。 mov reg,[bp]push/pop与堆栈段SS相关联, [rep] movs与DS相关联:[SI],ES:[二]; 程序计数器/跳跃与代码段CS有关。

的物理地址是在作为计算8086模式stack_reg * 16 +偏移,其中试图在seg_reg读取一个字:[FFFF]使得一个段冲突异常。

在8086架构VGA图形用存储器映射64k段到ISA总线实现。 还通过输入/输出指令编程硬件,有可能在图形卡来选择不同的64-K 页面 。 因此,有可能超出320×200×256彩色VGA限制推进到640×480 SVGA。



文章来源: How do 8-bit and 16-bit processors access more RAM with two registers?