<?xml version="1.0"?>
<?xml-stylesheet type="text/css" href="http://wiki.jackslab.org/skins/common/feed.css?303"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="zh-cn">
		<id>http://wiki.jackslab.org/index.php?action=history&amp;feed=atom&amp;title=%E7%B2%BE%E7%A1%AE%E5%BC%82%E5%B8%B8%E4%B8%8E%E9%9D%9E%E7%B2%BE%E7%A1%AE%E5%BC%82%E5%B8%B8</id>
		<title>精确异常与非精确异常 - 版本历史</title>
		<link rel="self" type="application/atom+xml" href="http://wiki.jackslab.org/index.php?action=history&amp;feed=atom&amp;title=%E7%B2%BE%E7%A1%AE%E5%BC%82%E5%B8%B8%E4%B8%8E%E9%9D%9E%E7%B2%BE%E7%A1%AE%E5%BC%82%E5%B8%B8"/>
		<link rel="alternate" type="text/html" href="http://wiki.jackslab.org/index.php?title=%E7%B2%BE%E7%A1%AE%E5%BC%82%E5%B8%B8%E4%B8%8E%E9%9D%9E%E7%B2%BE%E7%A1%AE%E5%BC%82%E5%B8%B8&amp;action=history"/>
		<updated>2026-09-11T07:02:40Z</updated>
		<subtitle>本wiki的该页面的版本历史</subtitle>
		<generator>MediaWiki 1.19.2</generator>

	<entry>
		<id>http://wiki.jackslab.org/index.php?title=%E7%B2%BE%E7%A1%AE%E5%BC%82%E5%B8%B8%E4%B8%8E%E9%9D%9E%E7%B2%BE%E7%A1%AE%E5%BC%82%E5%B8%B8&amp;diff=215&amp;oldid=prev</id>
		<title>Comcat：以“这里的异常是指同步的 (Synchronous)，非异步的中断。  非精确异常 (Imprecise Exception)  在多发射乱序执行的流水线 CPU 上，从指令...”为内容创建页面</title>
		<link rel="alternate" type="text/html" href="http://wiki.jackslab.org/index.php?title=%E7%B2%BE%E7%A1%AE%E5%BC%82%E5%B8%B8%E4%B8%8E%E9%9D%9E%E7%B2%BE%E7%A1%AE%E5%BC%82%E5%B8%B8&amp;diff=215&amp;oldid=prev"/>
				<updated>2013-01-18T06:48:00Z</updated>
		
		<summary type="html">&lt;p&gt;以“这里的异常是指同步的 (Synchronous)，非异步的中断。  非精确异常 (Imprecise Exception)  在多发射乱序执行的流水线 CPU 上，从指令...”为内容创建页面&lt;/p&gt;
&lt;p&gt;&lt;b&gt;新页面&lt;/b&gt;&lt;/p&gt;&lt;div&gt;这里的异常是指同步的 (Synchronous)，非异步的中断。&lt;br /&gt;
&lt;br /&gt;
非精确异常 (Imprecise Exception)&lt;br /&gt;
&lt;br /&gt;
在多发射乱序执行的流水线 CPU 上，从指令进入流水线到异常事件的发生，期间要经过若干流水级，此时 PC 的值已指向其后的某条指令，在实现非精确异常的 CPU 上就把此时的 PC 值作为引起异常指令的所在（为了表达的方便，记为 eptr）。&lt;br /&gt;
&lt;br /&gt;
简单地说就是 eptr 的指向，并非真正的引起异常的指令之所在，而是其后面的某条指令所在。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
精确异常 (Precise Exception)&lt;br /&gt;
&lt;br /&gt;
简单地说就是 eptr 的指向就是真正引起异常的指令之所在&lt;br /&gt;
&lt;br /&gt;
而实现精确异常的 CPU，则在最后指令提交时 (commit) 按指令流的顺序提交，异常的抛出也在该指令提交时，这样就能精确计算出引起异常的指令相对于当前 PC 的偏移，从而保证精确异常。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
不管是何类异常，eptr 之前的所有指令都会被执行完成 (commit)，eptr 之后的指令不会被执行。&lt;br /&gt;
&lt;br /&gt;
关于 eptr 的值，在 MIPS 上用 EPC 置之，在 PowerPC 上用 SRR0/CSRR0 置之，SPARC 上用 TPC[TL] 置之，x86 上当前 CS:EIP 即是，但 x86 将 CS:EIP 保存于栈上。&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
题外话：&lt;br /&gt;
&lt;br /&gt;
关于 eptr 的指向，还有一些情形值得考虑：&lt;br /&gt;
&lt;br /&gt;
A. 位于延迟槽中的指令 (MIPS, SPARC)&lt;br /&gt;
&lt;br /&gt;
B. 由分支指令引起 (x86)&lt;br /&gt;
&lt;br /&gt;
C. 上下文切换时 (x86)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;/div&gt;</summary>
		<author><name>Comcat</name></author>	</entry>

	</feed>