比较和跳转指令作为一条指令

时间:2012-11-11 21:22:32

标签: assembly nasm

有没有办法可以比较和跳转一条指令:

C代码:
 1. while(i<10)
 2. {i++}

汇编代码:(eax=0)(ecx=10)

  1. .while:
  2. cmp eax, ecx
  3. jge .endofwhile
  4. add eax, 1
  5. jmp .while
  6. .endofwhile:
  7. 有没有办法可以在一条指令中执行第2行和第3行?

2 个答案:

答案 0 :(得分:6)

是的,您可以将测试和分支视为单个指令,并且执行此操作的方法是将它们写为两条指令,使用现代英特尔处理器并遵循一些简单的规则(分支指令必须包含在测试指令结束的相同16字节代码行中,两条指令不能被任何其他指令分开,...)。

该机制称为macro-fusion。更详细的信息,包括适用宏观融合的精确条件,可从Agner Fog的manual,第82页获得。

答案 1 :(得分:6)

  

有没有办法可以在一条指令中执行第2行和第3行?

如果您允许更改C代码以向后计数:

1. i = 10;
2. while(--i >= 0);

然后你可以使用(单个)LOOP opcode

LOOP是一个旧的指令,因此它可能在新的(Pentium ++)CPU上被弃用:其中“不赞成”我的意思是“仍然支持,但比使用Pascal的答案中给出的更原始的操作码更慢”。