是
之类的说明fstmiaxne ip!, {d8-d15}
如果当前条件代码确保除非协处理器存在之外不执行操作,那么当必要的协处理器可能不存在时,在ARM程序集中使用是否有效/安全?
答案 0 :(得分:2)
这取决于架构版本和变体。从ARM体系结构参考手册(DDI 0406B):
未定义指令的条件执行
条件执行中描述的条件执行规则 第A8-8页适用于所有说明。这包括UNDEFINED 指令和其他可能导致进入的说明 未定义的指令异常。
如果此类指令未通过其条件检查,则行为取决于 关于架构概况和进入的潜在原因 未定义的指令异常,如下:
在ARMv7-A配置文件中:
- 如果潜在原因是执行指令本身 并取决于指令读取的数据值,指令 作为NOP执行,不会导致未定义的指令 异常。
- 如果潜在原因是执行早期的协处理器 指令,或指令本身的执行,但没有 取决于指令读取的数据值,它是IMPLEMENTATION 定义指令是作为NOP执行还是导致执行 未定义的指令异常。实现必须处理所有 这种情况也是一样的。
- 在ARMv7-R配置文件中,指令作为NOP执行,不会导致未定义指令异常。
注意
在ARMv7之前,所有实现都执行了任何失败的指令 它的状态检查为NOP,即使否则会导致 未定义的指令异常。未定义的指令处理程序 为这些实现编写的可能会假设没有检查 undefined指令通过了条件检查。这样的未定义 指令处理程序可能需要重写,以检查 条件在所有ARMv7-A上正常运行之前已通过 实现
由于您使用的是不推荐使用的VFP指令,我假设您在ARMv7之前处理了一个arch,因此您可以假设它将被视为NOP。
编辑:对于ARMv7-M(来自DDI 0403D):
未定义指令的条件执行
如果未定义的指令在ARMv7-M中的条件检查失败,则 指令表现为NOP,不会导致异常。
注意
条件字段为'1110'的Branch(B)指令未完成,除非通过条件检查合格,否则将发出异常 IT指令失败。
答案 1 :(得分:0)
这个网站似乎有一个答案:
http://www.peter-cockerell.net/aalp/html/app-a.html
另请注意,如果由于其条件代码导致ARM忽略指令而未执行指令,则它将永远不会“提供”给协处理器,或被捕获为未定义的指令。这意味着如果一条指令由于条件代码为“从不”而处于“无操作”状态,则其余指令可以是任何指令 - 它永远不会导致陷阱发生。
然而,如果没有声明的权威来源,我有点犹豫不得信任它。