我想知道汇编语言中的“语义NOP”是什么?
指的是不是实际的nop,但不影响程序行为的代码。
在C语言中,下面的代码序列可以被认为是语义上的NOP:
{
// Since none of these have side affects, they are effectively no-ops
int x = 5;
int y = x * x;
int z = y / x;
}
它们是没有实际作用的指令,就像 NOP 一样,但占用更多的字节。这对于将代码对齐到缓存行边界非常有用。例如,类似于 lea edi,[edi+0] 的指令,需要 7 个 NOP 才能填满相同数量的字节,但只需要 1 个周期。
mov al,al mov bl,bl mov cl,cl ... mov ax,ax mob bx,bx mov cx,cx ... xchg ax,ax xchg bx,bx xchg cx,cx ...请注意,除了“xchg ax,ax”之外,以上所有指令都是双字节指令。因此,英特尔已经宣布当需要一个单字节NOP时应使用“xchg ax,ax”。实际上,如果汇编“mov ax,ax”并对其进行反汇编,则会反汇编为“NOP”。