一些一直困惑我的是8位计算机如何访问超过256个字节的RAM。 我知道,它必须使用两个寄存器,但任何一个可以告诉我的是什么,这将看起来像汇编代码的例子吗?
喜欢:
mov a, [x] ???
一些一直困惑我的是8位计算机如何访问超过256个字节的RAM。 我知道,它必须使用两个寄存器,但任何一个可以告诉我的是什么,这将看起来像汇编代码的例子吗?
喜欢:
mov a, [x] ???
让我们想象一下,我们在寄存器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位操作的连续。
让我们考虑8080(Z80等),它有8位寄存器,但能够配对寄存器像16位寄存器。 可能是最常用的一对为HL,为H代表的8个高位和L为地址的低8位。 其他寄存器对BC分别和DE - 再次,大部分的操作只用一个一对套准工作的时间,但也有少数可以使用对连同16位数量(例如,至少如果没有记错的工作,有一个DE添加到HL)。
一些指导也可以直接使用16位地址:
jmp 01234h
6502是那种同样的方式,但它限制某些指令与第一个256个字节的RAM(又名“页0”)工作。 后来的版本(65816?)做支持采摘将被视为0页,虽然不同的物理地址。
有很多的技术来实现这一
英特尔8080是一个8位CPU,2个寄存器H和L为间接地址,从而允许其解决存储器的16位。 16位8086与分割20个地址。 80286使用24位地址与高16位段是一个索引段描述符表。 32位x86使用36个地址与PAE ...
PIC microcontrolers已在寄存器中的8位值合并在PC的高比特(或某些专用地址寄存器,因为我不记得),以形成13位地址(或更多,取决于结构)
在微控制器(某些微处理器架构)的另一种常见的方式是银行 ,在其中您更改“内存窗口”,该CPU可每次看到。
欲了解更多信息,你可以在这里阅读
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:[二]; 程序计数器/跳跃与代码段CS有关。
的物理地址是在作为计算8086模式stack_reg * 16 +偏移,其中试图在seg_reg读取一个字:[FFFF]使得一个段冲突异常。
在8086架构VGA图形用存储器映射64k段到ISA总线实现。 还通过输入/输出指令编程硬件,有可能在图形卡来选择不同的64-K 页面 。 因此,有可能超出320×200×256彩色VGA限制推进到640×480 SVGA。