1

有没有一种方法可以比较并跳转到一条指令:

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:

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

4

2 回答 2

6

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

该机制称为宏观融合。更多详细信息,包括宏融合应用的精确条件,请参见 Agner Fog 的手册,第 82 页。

于 2012-11-11T21:29:38.463 回答
6

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

如果允许您将 C 代码更改为倒数:

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

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

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

于 2012-11-11T21:49:06.273 回答