Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly NMI和IRQ中断_Assembly_6502 - Fatal编程技术网

Assembly NMI和IRQ中断

Assembly NMI和IRQ中断,assembly,6502,Assembly,6502,我试图找到6502处理器如何处理中断的信息,但我非常困惑。我见过一些关于它的例子,但它就像一个正常的亚芦丁 我有一些使用8086处理器的经验,我记得有一些代码可以处理不同的中断 首先,如果有人能用一些代码向我解释NMI和IRQ之间的区别,我将非常感激。更重要的是,如果您能为我提供更多关于处理中断的信息,例如处理键盘中断。NMI(不可屏蔽中断)和IRQ(中断请求)是CPU包上独立的物理引脚 触发中断时,执行跳转到0xFFFE和0xFFFF(用于IRQ)指向的内存位置。对于大多数处理器,应使用以下方

我试图找到6502处理器如何处理中断的信息,但我非常困惑。我见过一些关于它的例子,但它就像一个正常的亚芦丁

我有一些使用8086处理器的经验,我记得有一些代码可以处理不同的中断

首先,如果有人能用一些代码向我解释NMI和IRQ之间的区别,我将非常感激。更重要的是,如果您能为我提供更多关于处理中断的信息,例如处理键盘中断。

NMI(不可屏蔽中断)和IRQ(中断请求)是CPU包上独立的物理引脚

触发中断时,执行跳转到0xFFFE和0xFFFF(用于IRQ)指向的内存位置。对于大多数处理器,应使用以下方法将寄存器推送到堆栈:

PHA
PHX
PHY
SEI
可用于禁用IRQ,但不能禁用NMI
CLI
将再次启用它们


有很多教程。

有两个独立的中断:可屏蔽和不可屏蔽。6502将在每条指令结束前对这一周期进行采样

如果NMI线路已激活(其边缘已触发),则该操作完成后,它将执行NMI例行程序

否则,如果IRQ线处于活动状态(其电平已触发),且未设置中断禁用标志,则该操作完成后,它将执行IRQ例程

在这两种情况下,它将读取跳转向量,将当前程序计数器和状态寄存器推送到堆栈,设置中断禁用位,并跳转到向量指示的任何位置。根据记忆,这一切都需要七个周期

除了推送状态寄存器,谁负责增加程序计数器的值也是有区别的,因此您可以使用
RTI
从中断处理程序返回,而不是
RTS

NMI向量从FFFA/FFFBh读取,IRQ从FFFE/FFFFh读取。重置向量介于和之间,您可以在一定距离内将重置视为一种无法返回的NMI

BRK
本应模拟IRQ,但效果不太好


因此,计划中的安排是:NMI适用于任何现在应该始终提供服务的设备。IRQ对任何可以等待一段时间的事情都有好处。相当多的微型计算机根本不连接NMI,因为这样您就必须有一个工作的处理器,但这远远不是通用的。

在回答您的问题时,NMI和IRQ在6502上的运行方式几乎相同。它是一个七周期操作,可在MOS 6502编程手册第9章中找到,该章涵盖了所有中断类型指令。正如其他人所指出的,NMI代表不可屏蔽中断,IRQ代表中断请求(因为它可以被屏蔽)。NMI使用矢量地址FFFA-FFFB,而IRQ和BRK都使用FFFE-FFFF

请记住,当JSR指令存储PC寄存器时,它指向JSR指令的最后一个字节,NMI和IRQ操作存储中断结束时要执行的下一条指令的第一个字节。这就是为什么RTS和RTI不能互换使用的部分原因

BRK的工作原理与IRQ类似,但有两个例外。首先,尽管BRK只是一个单字节指令,但PC寄存器在存储前会提前两次,因此返回地址将是BRK后的第二个字节。其次,设置存储在堆栈上的P寄存器(状态寄存器)值的第4位,同时清除IRQ。请注意,该位实际上不是内部连接的,因此如果使用PHP,则PLA读取状态寄存器,将始终设置位4,因为6502上的数据线默认为高


MOS 6502编程手册对于理解6502是如何工作的非常有用,因为它概述了每种类型的6502指令和中断是如何执行的。

NMI(不可屏蔽中断)是一种中断,不能或不应该被禁用,因为它们是为非常严重的问题触发的。IRQ是可启用/禁用的正常中断,可用于不同目的(例如定时器中断)。我对6502不太熟悉,但如果您想要x86的代码示例,我可以给您看一个6502汇编程序中irq和nmi的基本示例,不是吗?“如果未启用保护模式虚拟中断,则清除EFLAGS寄存器中的If标志。其他标志不受影响。清除If标志会导致处理器忽略可屏蔽的外部中断。”@Cees,这是x86引用。与问题完全无关。作为6502如何处理中断的进一步澄清,NMI和IRQ线处于低电平,这也是为什么P寄存器中的I标志必须清除,IRQ才能生成的原因。内部逻辑使用“或非门”确定是否确认IRQ。