英特尔手册对规范地址和一般保护异常进行了以下说明:
来自(第 1 卷,第 3-13 页):
“如果线性内存引用不是规范形式,则实现应该生成异常。在大多数情况下,会生成通用保护异常 (#GP)。...”
来自(第 3A 卷,第 6-52 页):
“以下情况会导致 64 位模式下的一般保护异常:
- 如果内存地址采用非规范形式。
- 如果段描述符内存地址采用非规范形式......”
我很想知道 RIP 的内容是否也被归类为“内存地址”,如上面引用中所述。还是 RIP 可以包含非规范地址但在 RIP 用于引用内存中的位置之前不会引发#GP?
[编辑]
我现在更仔细地阅读手册,尤其是 CALL、RET 和 JMP 指令的伪代码(因为它们可以随意更改 RIP)。我注意到在 64 位模式下,地址的规范性检查是在它存储到 RIP 之前完成的,因此在 RIP 获得非规范地址之前会引发#GP。所以,我的问题的答案是 RIP 永远不能包含非规范地址。
我担心的情况 --- 因为包含非规范地址的 RIP 用于引用内存位置而引发#GP --- 根本不会出现。