让我感到困惑的是8位计算机如何访问超过256字节的RAM。我知道它必须使用两个寄存器,但是任何人都可以向我展示汇编代码中它的样子吗?
像:
mov a, [x] ???
答案 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每次都能看到的“内存窗口”。
有关详细信息,您可以read here
答案 3 :(得分:2)
6502已经索引了内存读取指令lda $01200,Y
和lda $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。