3

反復ごとにRAXをデクリメントしています。RAXがゼロの場合、プログラムはフローを変更する必要があります。

# AT&T syntax
start_calc_factorial:
  decq %rax
  cmpq $0, %rax
  je quit_calc_factorial
  mulq %rcx
  jmp start_calc_factorial

ただし、プログラムが終了することはありません。デバッガーは、RAXの値が(おそらくアンダーフローですが、命令0xa0257c7238581842が原因ではないはずです)であることを通知します。jeRAXの初期値は7です。

何が問題なのですか?

4

2 に答える 2

6

乗算の結果はRAXレジスタに格納されると思います。そのため、ループが混乱することは間違いありません。

于 2011-12-01T18:06:10.103 に答える
3

問題は、引数と積の両方として同じレジスタ、raxを使用することです。あなたのコードはこのCコードと同等です:

while (1)
{
  rax = rax - 1;
  if (rax == 0) break;
  rax = rax * rcx;
}

永久ではないにしても、長時間ループする可能性があります。

あなたがおそらく欲しいのはこれです:

while (1)
{
  rcx = rcx - 1;
  if (rcx == 0) break;
  rax = rax * rcx;
}
于 2011-12-01T18:10:13.990 に答える