中断如何在Intel 8080上运行?我搜索了谷歌和英特尔的官方文档(197X),我发现只有一点关于此的描述。我需要对它进行详细解释,以模拟这个CPU。
答案 0 :(得分:14)
8080有一个中断线(引脚14)。所有外围设备都连接到此引脚,通常采用“线”或“线”连接。配置(意味着中断请求输出为集电极开路,中断引脚通过电阻拉高)。在内部,处理器具有中断使能位。两个指令,EI和DI,设置并清除该位。整个中断系统因此被打开或关闭,个别中断不能被掩盖在"裸" 8080.当设备发出中断时,处理器以“中断确认”(#34; Interrupt Acknowledge" (~INTA)信号。该信号与"存储器读取"具有相同的时序。 (~MEMR)信号,用于触发外围设备放置"重启"数据总线上的指令。中断应答信号基本上是一个取指令周期,它仅在响应中断时发生。
有8个重启指令,RST 0 - RST 7. RST 7是操作码" 0xFF"。重启指令使处理器按下堆栈上的程序计数器并开始在重启矢量位置执行。 RST 0向量为0x0000,RST 1向量为0x0008,RST 2向量为0x0010,依此类推。将7个向量重新启动到0x0038。这些向量地址旨在包含可执行代码,通常是对中断服务例程的跳转指令。中断服务程序将堆栈它使用的所有寄存器,执行必要的I / O功能,取消堆栈所有寄存器并通过结束子程序(RET,操作码0xC9)的相同返回指令返回主程序。
重启指令是实际操作码,这意味着如果在程序执行期间从内存中取出它们,它们将执行相同的操作。使用Restart 7作为"暖启动"对于键盘监视器/调试器程序,因为早期EPROM通常在每个空白位置包含0xFF。如果您执行空白EPROM,这意味着出现了问题,您可能还想回到显示器。
请注意,RST 0向量转移到与RESET相同的内存位置,都开始在0x0000执行。但是RST 0在堆栈上留下了返回地址。在某种程度上,RESET可以被认为是8080唯一不可屏蔽的中断。
中断信号也会清除中断位,因此中断服务程序需要执行EI指令,通常在RET之前。否则,系统将响应一个且仅一个中断事件。
CP / M为系统使用保留了前256个字节的内存 - 该中断向量映射使用了前64个字节(每个Restart指令8个字节)。在CP / M系统上,RAM从0x0000开始,任何ROM都在内存的高端。这些系统使用某种形式的智能组切换来在RESET之后立即切换到EPROM,以便向系统ROM提供JUMP指令,以便它可以开始引导序列。在存储器映射的低端具有ROM的系统将JUMP指令编程到位于RAM中的向量到前64个字节中。这些系统必须在启动时初始化这些RAM向量。
答案 1 :(得分:2)
中断处理程序的函数指针存储在低内存中。 大约32个左右的第一个地址是硬件中断:硬件触发。
接下来的32个地址是用户可触发的,这些被称为软件中断。它们由INT
指令触发。
INT的参数是软件中断向量编号,它将是被调用的中断。
您需要使用IRET
指令从中断返回。
您可能还应该在输入中断时首先禁用中断。
有关更多详细信息,请参阅特定处理器型号的文档,它往往差异很大。
答案 2 :(得分:2)
中断是一种通过通知处理其他内容来中断cpu的方法,我不确定Intel 8080芯片,但根据我的经验,描述中断的最佳方法是:
CS:IP
(代码段:指令指针)在此指令的内存地址0x0000:0020,作为示例,为了使用Intel 8086指令解释它,汇编程序是乱码并且没有实际意义......说明是富有想象力的
0x0000:001C MOV AH, 07 0x0000:001D CMP AH, 0 0x0000:001E JNZ 0x0020 0x0000:001F MOV BX, 20 0x0000:0020 MOV CH, 10 ; CS:IP is pointing here 0x0000:0021 INT 0x15
当CS:IP指向下一行并发出INT
突发15十六进制时,会发生这种情况,CPU将寄存器和标志压入堆栈,然后执行0x1000:0100处的代码,它以INT 15为例提供服务
0x1000:0100 PUSH AX 0x1000:0101 PUSH BX 0x1000:0102 PUSH CX 0x1000:0103 PUSH DX 0x1000:0104 PUSHF 0x1000:0105 MOV ES, CS 0x1000:0106 INC AX 0x1000:0107 .... 0x1000:014B IRET
然后当CS:IP命中指令0x1000:014B时,会发出IRET
(中断返回),它会弹出所有寄存器并恢复状态,并在执行时执行CPU的CS:IP在0x0000:0021的指令之后回到这里。
0x0000:0022 CMP AX, 0 0x0000:0023 ....
CPU如何知道跳转到特定偏移的位置是基于中断向量表,这个中断向量表是由BIOS在BIOS中的特定位置设置的,它看起来像这样:
INT BIOS's LOCATION OF INSTRUCTION POINTER --- -------------------------------------- 0 0x3000 1 0x2000 .. .... 15 0x1000 <--- THIS IS HOW THE CPU KNOWS WHERE TO JUMP TO
该表存储在BIOS中,当执行INT
15时,BIOS将CS:IP重新路由到BIOS中的位置,以执行处理中断的服务代码。
在过去,在Turbo C下,有一种方法可以使用函数setvect
和getvect
覆盖中断向量表例程和自己的中断处理函数,其中实际的中断处理程序被重新路由到您自己的代码。
我希望我已经解释得很好了,好吧,它不是英特尔8080,但这是我的理解,并且可以确定该芯片的概念与英特尔x86系列芯片的概念相同。< / p>
答案 3 :(得分:1)
8080依赖于外部硬件来控制其对中断的处理,因此无法概括。查找有关Intel 8214或8259中断控制器的信息。
答案 4 :(得分:1)
我终于找到了它!
我创建了一个名为bus的变量,其中有中断操作码。 然后,我调用了一个函数来处理中断:
void i8080::interruption()
{
// only for RST
cycles -= cycles_table[bus];
instruction[bus]();
INT = false;
}
当需要中断时,INT是真的。 EI和DI指令处理INTE。
当INT和INTE为真时,执行中断。