某些NOP代码是否与其他代码不同?


12

我对此很好奇,可以说我有:

00000000001 90                              nop        
00000000002 90                              nop        
00000000003 90                              nop 

它执行的方式与此完全一样吗?

00000000001 0F1F00                          nop        dword [ds:rax]

与第一个例子相比,第二个例子会产生什么影响?


1
我倾向于认为第二条指令比第三条指令执行得更快,因为它是一条指令而不是3条指令。不过,现代的流水线技术可能会改变它。
罗伦·佩希特

1
为什么标记为c
基思·汤普森

Google for multi byte nop出现了很多结果。
phant0m 2012年

1
@KeithThompson-我拉了C和编码样式的标签;他们不属于。

@ phant0m-您会将该评论放入答案中并总结一些更相关的结果吗?并非所有人都具有正确理解该搜索查询返回的背景。

Answers:


2

这取决于机器架构。经典的KA-10(pdp-10)有很多nop代码,这可能是由于它的规则性很高的指令集,以及所有这些代码都是由离散组件而不是微代码实现的结果。一些NOP引用了内存,一些是从未跳过过的跳过测试,但是仍然测试了可能导致跳过的条件,依此类推。在手册中广告“ JFCL 0”是最快的点。


我曾经研究过(8085?)汇编程序,该汇编程序提供了用单个JMP指令替换多个NOP的选项。您获得了想要的性能,而无需支付性能损失。当您在PIC中具有字符串时很方便,如果您具有基于CPU的定时循环(这是默认情况下处于关闭状态的原因),则不会很方便。
TMN 2012年

大多数情况下,通常由于某些硬件依赖性或设备错误解决方法,NOP指令用于插入短延迟。性能损失是使用NOP的原因。
uɐɪ

1
鼻子有很多深奥的用途。一些体系结构对跳转有字节对齐要求。自修改代码(恐怖!)使用nops作为接合点。错误系统使用nops存储有关失败的断言的信息。
ddyer 2012年

@ddyer:某些处理器具有指令(有时有文档记录,有时没有记录),这些指令将获取一个内存字节,或者完全忽略所获取的值,或者除了设置标记可能不会引起程序员的任何关注之外,不对其进行任何处理。在6502上,使用“ BIT abs”指令作为吞噬下两个字节的方法非常普遍。还有一些未记录的操作码,它们的行为类似,只是它们不更新任何标志。不过,有一个使用这些技巧的警告:它们将导致读取一个字节的地址空间。一些6502外围设备可能会对读取操作做出反应。
supercat 2012年

0

看来第二个示例的运行速度应比第一个示例快。在第一个示例中,将执行三个单独的指令。在第二条中,只有一条指令。多字节NOP旨在用于CPU“提示”(确切地说,方式和时间显然是机密的)。它们可用于对齐目的(在高速缓存行上开始紧密循环),但是目前它们没有其他用途。目前尚不清楚CPU是否实际评估参数,因此无法确定是增加指令解码时间还是会导致内存访问损失。拥有良好ICE的任何人都想测试其中之一,并查看总线跟踪上弹出了哪些地址?


尽管许多6502汇编程序对执行内存访存的未记录操作码使用助记符“ NOP”(例如,NOP $ 1FF9)将是一个两字节的指令,读取地址0x1FF9并忽略读取的值),但我不希望芯片制造商这样做对于无法执行超出程序计数器/指令指针的任何操作的指令,请使用术语“ nop”,因为无法保证处理器不会被挂钩到在某些地址(例如0x1FF9)触发动作(例如,切换到代码库1)的硬件时)被访问,并且这种触发并非完全是“无操作”。
超级猫
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.