内存
内存不仅包括内存条,还包括显存等,在8086中显存可以直接访问,可以通过DOSBox去修改显存上的值以改变屏幕像素值。另外计算机与其他外设通信时通过端口,如鼠标键盘,音响等。他们内部也和CPU一样都有芯片。外设的输入不直接送入内存和cpu,而是送入相关的接口芯片的端口中,cpu向外设的输出也不是直接送入外设,而是先送入端口中,再由相关的芯片送到外设。cpu还可以向外设输出控制命令,而这些控制命令也是先送到相关芯片的端口中,然后再由相关的芯片根据命令对外设实施控制。可见cpu通过端口和外部设备进行联系。
寄存器与寻址
8086是16位CPU,CPU内部 寄存器 都是16位。那么地址也是由CPU里面的寄存器提供的,故只能提供16位地址,可寻址64K空间。而8086觉得64K空间不够用,引脚地址线要弄成20条,寻址1M空间。但CPU里面地址只能是16位提供16位地址,里面的16位地址和外面的20根地址线矛盾怎么解决呢?只好多加了那几个 段寄存器 ,和一些如DI的指针寄存器。每次形成地址时,根据不同的指令,系统会自动选取一个段寄存器(16位)左移四位后再加上一个对应的指针寄存器(在BIU里的地址 加法器 中完成),形成实际的物理地址20位输出,可寻址1M空间。你看四个段左移四位后形成20位的实际物理地址的段基址,再加上各自的指针64K的范围,四个段每个都是64K。 总结:8086采用这种段加偏移技术,可以解决内部寄存器16位,但可提供20位地址的问题,将外寻址空间扩大到1M。我们在程序最初将CS DS SS ES给初值后,那这四个段在1M空间中的起始位置就确定了,由于每段对应的指针(如DI)是16位,故每段大小是64K。当然CS,DS还可以再重给初值对段重新定义,CS,DS可以相同几个段重叠(如果放得下的话),也可以分开。