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

Wei*_*ram 1 assembly nasm

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

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

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

  1. .while:
  2. cmp eax, ecx
  3. jge .endofwhile
  4. add eax, 1
  5. jmp .while
  6. .endofwhile:

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

Pas*_*uoq 6

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

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


Chr*_*isW 6

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

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

1. i = 10;
2. while(--i >= 0);
Run Code Online (Sandbox Code Playgroud)

然后你可以使用(单个)LOOP操作码.

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