为什么跳转指令之前会有一个无操作指令?

3

嗯,我和一位朋友正在进行一个项目,我们遇到了一个近似的跳跃,然后是nop……是否有在调用某个东西之后暂停的原因?

nop在代码末尾,它会为处理器准备空闲状态吗?


2
什么架构?如果没有这个事实,我们都只是在猜测。 - bmargulies
1
请澄清一下 - 这是跳转还是调用,nop 指令在前面还是后面? - Jens Björnhager
2个回答

3

这个问题是关于编码的短跳转是否实际上已经被编码为近跳转。

如果是这样的话,短跳转(3个字节)将在第三个字节上填充。如果在编码时,汇编器知道短跳转的跳转位置实际上是一个近跳转,它会将其编码为近跳转。但是,由于已经为短跳转保留了3个字节,因此需要使用NOP进行填充。


2

根据汇编架构的不同,它可能存在于对齐后续函数地址的位置,或者是为了防止下一条指令被执行(我相信MIPS会这样做)。有时,在用于本地内存池的函数之后,您还会看到nop和一堆随机数据(ARM)。


SPARC有“分支延迟指令”。 - Ben Jackson
英特尔X86,确切地说是286,使用MASM语法。 - iDomo
那么,要么是函数指令对齐问题,要么是@Mitch(我向他卓越的心灵能力致敬)提出的短跳转与近跳转解释。 - Michael Dorgan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接