1 寻址
CPU和内存的关系,就象一个计算器和一张纸。你把要做的事写到纸上。然后让计算器去照着做。计算器就是CPU。内存就是纸。怎么让cpu找到要执行的程序和数据就是寻址!
2中断
你的计算机在执行一个预先安排好的事.这时你按了一下键盘希望它能响应你.这时cpu就停下目前的工作去看有什么事发生.如果处理了这件事.就在继续执行刚才放下的事.这一过程叫中断执行.cpu要完成这件事就要知道两件事.第一就是要知道扫描键盘的程序在哪里.第二是执行完成后回到哪里.这就是中断向量和堆栈.向量指明了cpu可以到哪里找到扫描键盘的程序.堆栈里则保存着断点.为什么可以用这些地方呢?因为在cpu设计时就定义了这些地方.所以cpu可以找到!这是硬中断。它是由外界的信号引起的。还有一些是因为cpu本身引起的。例如时钟定设备时器走到一定的时间也会引起中断。cpu执行了一些错误的指令如被零除等。也会引起中断。还有一些是由于执行了特定的指令也可以引起中断。为什么要有这样的指令呢。我们在一个多段程序中想使用外设(打印机、声卡等)或是想调用一些特定的功能(多数都是操作系统的功能。所以也叫系统调用)这时也会引起cpu的中断。
3 堆栈
刚才说了中断要保存断点。保存到哪里呢。内存中。内存哪里呢。由cpu中的一个特定的存储器叫堆栈指针寄存器指定的地方。(cpu中的存储器就叫寄存器)寄存器可以分六大类。
1有可以进行数学运算的—累加器。
2标志cpu工作状态的(累加器的运算结果、数据的符号等)。
3还有程序执行的地址PC等。
4堆栈指针寄存器。
5就是一些存数据的。通用寄存器。
6标志程序指令或数据位置的。段寄存器。
刚才讲道的堆栈指针寄存器。堆栈指针寄存器有加一、减一的操作。保存数据后自动的加或减使它指向下一个地址。是加是减就是压栈和出栈。中断发生时cpu会自动的把断点的地址保存到堆栈指针寄存器指定的地址里去。不需要人工干预。但是中断程序里,要用的寄存器(寄存器是共用的)要写中断程序的人给保存好。要不就可能会干扰被中断的程序!在返回被中断程序前时又要手工的把保留的数据变回去。刚才自动保存的地址不用你手动恢复。cpu根据它跳回到断点处。为什么要后进先出呢?这个你自己想吧!调用子程序时同中断类似。也可以把中断看做是一个特殊的子程序。
4
地址分段内存中的数据可以直接找到。干吗还那么麻烦的用个什么段地址寄存器来指定。多麻烦啊!回答这个问题要从象操作系统这样的软件说起。操作系统一般都要进行任务的调度。那么多程序放到内存里。在调度时要找到它们就是一件不容易的事。这还不是麻烦的。你在编程序时可不知道操作系统要把它放到哪里。那你怎么在转跳时把位置搞定啊!这时要是能不用操心它就好了。哪我就假定它是从一个特定的地址开始的。我写程序就照它写。不就解决问题了吗?这样做操作系统就傻眼了。它要改那些你指定的地址可是很麻烦啊!为了这些问题。出现了 MMU(memory manager unit)内存管理单元。可以解决上面的问题。写程序时你照着给定的地址写。执行时cpu改一下段地址寄存器(code segment register)的值。就很快的改好了。因为段寄存器加上你假定的地址,就是你内存的地址。怎么回事呢!例如你现在在内存的地址是A。你要跳转的地址是 X。这时你要是执行程序很可能出现错误。因为你在写程序时不是假定的A而是一个别的地址。那还不出错啊!同理在定位操作数时也一样。那让操作系统改不就行了吗?可是鬼知道你定义的变量在哪里啊!回到刚才的问题。cpu不知道你怎么编的程序。它在执行时用段寄存器做参考。你变量地址就成为一个相对于段的偏移量。段地址+你的地址。是不是很方便!至于保护模式有个物理地址和线性地址的事。
5 外设操作操作外设
不同的cpu体系有不同的设计。主要分两类。一类是与内存地址分开编址(I/O独立式)。一类是与内存地址一同编址(端口映射式)。8086是I /O独立式。早期的APPLE是端口映射式。分别讲一下。I/O独立式就是把I/O输入输出设备编到I/O地址里与内存分开。操作设备就是向哪个I/O地址写或读。因为不与内容编址。所以指令也不同。out 10H就是向I/O地址的10H的这个设备写入数。操作数在A寄存器里。怎样的好处是可以把内存做的很大。设备也可以用不同的机器周期。端口映射式就是把 I/O设备编到统一的地址里。和内存占用同样的地址线。好处是寻址灵活。但减少了内存的空间。如果你要操作设备就可以用ld [xxxx]。这样的指令。cpu设计也简单了。还有一些其它方式。如8051这样的芯片它的外设是在内部寄存器里的。
6 DMA
DMA是不需要CPU参与的情况下由外设来操作地址总线向内存写数或读数。这种机制可以省去cpu时间。使I/O的速度加快。再有就是CPU的速度和外设的配备。
注1 10H是COMS的地址