11

中断如何在 Intel 8080 上工作?我搜索了谷歌和英特尔的官方文档(197X),我只找到了一点关于这个的描述。我需要一个详细的解释来模拟这个 CPU。

4

5 回答 5

21

8080 有一条中断线(引脚 14)。所有外设都连接到该引脚,通常采用“线或”配置(意味着中断请求输出为集电极开路,中断引脚被电阻拉高)。在内部,处理器有一个中断允许位。EI 和 DI 两条指令设置和清除该位。整个中断系统因此被打开或关闭,单个中断不能在“裸”8080上被屏蔽。当设备发出中断时,处理器以“中断确认”(~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 个字节(每个重启指令 8 个字节)。在 CP/M 系统上,RAM 从 0x0000 开始,任何 ROM 都位于内存的顶端。这些系统使用某种形式的智能库切换来切换 EPROM 或在 RESET 之后立即切换以向系统 ROM 提供 JUMP 指令,以便它可以开始引导序列。在内存映射低端具有 ROM 的系统将 JUMP 指令编程到位于 RAM 中的向量的前 64 个字节中。这些系统必须在启动时初始化这些 RAM 向量。

于 2014-10-04T22:11:33.793 回答
1

8080 依赖外部硬件来控制其对中断的处理,因此无法一概而论。查找有关 Intel 8214 或 8259 中断控制器的信息。

于 2010-01-29T23:31:45.397 回答
1

我终于找到了!

我在中断操作码所在的位置创建了一个名为 bus 的变量。然后,我调用了一个函数来处理中断:

void i8080::interruption()
{
    // only for RST
    cycles -= cycles_table[bus];
    instruction[bus]();
    INT = false;
}

INT 在需要中断时为真。EI 和 DI 指令处理 INTE。

当 INT 和 INTE 为真时,执行中断。

于 2010-01-30T02:23:22.560 回答
0

中断是一种通过通知中断 cpu 以处理其他事情的方式,我不确定 Intel 8080 芯片,但根据我的经验,描述中断的最佳方式是:

CS:IP代码段:指令指针)在内存地址0x0000:0020的这条指令上,作为一个例子,为了解释它使用Intel 8086指令,汇编程序是乱码,没有真正的意义......这些指令是富有想象力的

0x0000:001C 移动啊,07
0x0000:001D CMP 啊,0
0x0000:001E JNZ 0x0020
0x0000:001F MOV BX,20
0x0000:0020 移动通道,10;CS:IP 指向这里
0x0000:0021 INT 0x15

当 CS:IP 指向下一行并发出一个INT15 十六进制的错误时,会发生这种情况,CPU 将寄存器和标志压入堆栈,然后执行 0x1000:0100 处的代码,以 INT 15 为例

0x1000:0100 推斧
0x1000:0101 推送 BX
0x1000:0102 推送 CX
0x1000:0103 推送 DX
0x1000:0104 推送
0x1000:0105 移动 ES,CS
0x1000:0106 INC 轴
0x1000:0107 ....
0x1000:014B IRET

然后当 CS:IP 命中指令 0x1000:014B 时,发出一个IRET(中断 RETurn),它会弹出所有寄存器并恢复状态,当它被执行时,CPU 的 CS:IP 在指令之后指向这里在 0x0000:0021。

0x0000:0022 CMP 轴,0
0x0000:0023 ....

CPU 如何知道跳转到特定偏移的位置是基于中断向量表,此中断向量表由 BIOS 在 BIOS 中的特定位置设置,如下所示:

INT BIOS 的指令指针位置
--- --------------------------------------
0 0x3000
1 0x2000
…………
15 0x1000 <--- 这就是 CPU 知道跳转到哪里的方式

该表存储在 BIOS 中,当INT执行 15 时,BIOS 会将 CS:IP 重新路由到 BIOS 中的位置以执行处理中断的服务代码。

回到过去,在 Turbo C 下,有一种方法可以使用您自己的中断处理函数覆盖中断向量表例程,setvect其中getvect实际的中断处理程序被重新路由到您自己的代码。

我希望我已经解释得很好,好吧,它不是英特尔 8080,但这是我的理解,并且可以肯定该芯片的概念与英特尔 x86 系列芯片的概念相同。

于 2010-01-29T23:47:00.503 回答
0

指向中断处理程序的函数指针存储在低位存储器中。大约 32 个左右的第一个地址是硬件中断:硬件触发。

接下来的 32 个左右的地址是用户可触发的,这些被称为软件中断。它们由INT指令触发。

INT 的参数是软件中断向量号,它将被调用的中断。

您将需要使用该IRET指令从中断中返回。

您可能还应该禁用中断作为进入中断时做的第一件事。

有关更多详细信息,您应该参考特定处理器型号的文档,它往往变化很大。

于 2010-01-29T23:26:58.560 回答