assembly 在8086中可以访问的最大内存容量(以字节为单位)是多少?

ht4b089n  于 2022-11-24  发布在  其他
关注(0)|答案(2)|浏览(147)

另外,一个程序在内存中最少可以占用多少空间?
我知道8086中每个寄存器的最大容量为16位

lsmepo6l

lsmepo6l1#

8086具有20位线性/物理地址空间,因此1MiB的RAM + ROM+设备内存。
8086上唯一可用的模式是后来的CPU所称的"实模式",其中seg:off逻辑地址的两个16位的一半Map到线性地址(seg<<4) + off。该计算可以稍微超过1MiB,并且在后来的CPU/系统上,可以禁用到20位的回绕(A20门),尽管这对于设置不同的段基的其他模式非常有用,允许访问更多的内存。
Michael Petch评论说,一些附加卡提供了一个64K的窗口到大量的物理内存,比如高达32MiB。所以这就像"银行切换"。为了访问该空间的不同部分,程序将不得不做一个I/O操作,比如out指令。逻辑上,这有点像分页到硬盘驱动器或SSD,除了存储直接进入额外的内存。因此,您可以从修改过的存储体切换出来,而无需先进行写回操作。当然,性能也有很大的不同,切换存储体的延迟大大低于在旋转硬盘上写入+读取64K。但它对软件并不透明,因此它的工作方式不像有大量RAM来运行不知道这种插入式内存扩展卡的程序。

    • 最小 * 程序 * 大小取决于操作系统。**在DOS下,一个包含C3ret)的1字节.com文件将干净地执行,返回到DOS放入其内存映像的退出系统调用。我不知道不同版本的DOS需要多少空间来实际加载它;假定至少512字节磁盘扇区加上用于PSP(程序段前缀)的空间。

在裸机上,具有无限循环的2字节ROM(jmp $,即jmp rel8=-2)可能会执行,尽管您只能通过观察它重新获取代码时的地址行来了解它,因为它当然不能做任何事情。(您可能需要一个cli,尽管CPU启动时可能禁用了中断)。
如果它是连接到8088的全部,则它只需要对地址线的低位进行解码,以便在8位总线上单独提供每个字节。如果连接到8086,则它不需要对任何地址线进行任何解码,只需对时钟和读取信号进行解码。或者你可以把8086的16个引脚硬连线到电源和地。

0x6upsns

0x6upsns2#

8086处理器可以使用segmented memory model寻址1 MB的内存。内存段可以包含代码或数据(或两者),给定段最大可达64 K。
实际上,memory space的一部分被中断向量表、BIOS和设备(如图形卡的内存缓冲区)占用。可寻址 RAM 的确切数量取决于硬件配置。
虽然1 MB是8086(或以后的处理器的真实的模式)直接寻址的内存的极限,但可以使用存储体切换技术将额外的内存Map到该地址空间的窗口中。
在MS-DOS中,第一个标准的存储体切换实现被称为LIM(Lotus、Intel、Microsoft),它允许切换Map到地址空间中4个最高16 KB存储器块中的每一个的物理存储器,这被称为上部存储区(UMA)。
后来的扩展存储器规范(XMS)允许扩展的物理存储器在任何地方Map到可用的地址空间。
当时的游戏机也使用了类似的技术。

相关问题