8位和16位处理器如何通过两个寄存器访问更多RAM?

时间:2012-12-02 23:04:11

标签: assembly ram memory-address 8-bit

让我感到困惑的是8位计算机如何访问超过256字节的RAM。我知道它必须使用两个寄存器,但是任何人都可以向我展示汇编代码中它的样子吗?

像:

mov a, [x]   ???

4 个答案:

答案 0 :(得分:6)

让我们假设我们在寄存器L和H中具有LOWER和更高8位地址的一半。例如,我们想从地址32770 dec = 8002 hex读取字节。

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位操作。

答案 1 :(得分:3)

让我们考虑8080(Z80等)它有8位寄存器,但可以将寄存器配对,就像16位寄存器一样。可能最常用的对是HL,对于8个高位是H,对于地址的8个低位是L.其他寄存器对是BC和DE - 同样,大多数指令一次仅使用该对中的一个寄存器,但是少数可以一起使用该对来处理16位量(例如,至少如果存储器服务,有一个将DE添加到HL)。

某些指令也可以直接使用16位地址:

jmp 01234h

6502有点相同,但它限制了一些指令来处理前256个字节的RAM(又名“Page 0”)。更高版本(65816?)确实支持选择不同的物理地址,这些地址将被视为第0页。

答案 2 :(得分:3)

There are lots of techniques to achieve this

Intel 8080是一个8位CPU,带有2个寄存器H和L,用于间接寻址,允许它寻址16位存储器。 16位8086具有20位地址和分段。 80286使用24位地址,高16位段是段描述符表的索引。 32位x86使用36位地址和PAE ...

PIC微控制器的寄存器中的8位值与PC中的高位(或某些专用地址寄存器,如我不记得)合并形成13位地址(或更多,取决于架构)

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

  • Intel 8051有4个寄存器组,其中公共的一个总是可见的,其余的可以通过组切换指令选择。某些版本可以使用banking作为代码地址,将其扩展到2MB的代码。
  • DOS使用EMSXMS中的内存存储来将较高内存映射到较低地址,以便访问超过1MB或RAM。
  • 32位Windows在PAE模式下使用Address Windowing Extensions以允许32位进程访问超过2GB的RAM

有关详细信息,您可以read here

答案 3 :(得分:2)

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

然后8086具有分段架构,其中每个存储器访问都与隐式或显式段寄存器耦合。 mov reg,[bp]push/pop与堆栈段 ss 相关联,[rep] movs与ds关联:[si],es:[di];程序计数器/跳转与代码段 cs 相关联。

物理地址在8086模式下计算为stack_reg * 16 + offset,其中尝试读取seg_reg中的单词:[ffff]导致段违例异常。

8086架构中的VGA图形是通过将64k段映射到ISA总线的内存实现的。此外,通过输入/输出指令对硬件进行编程,可以在图形卡上选择不同的64-k 。因此,有可能超过320x200 x 256色VGA限制到640x480 SVGA。