Бесконечный цикл при использовании cmpq и je - PullRequest
3 голосов
/ 01 декабря 2011

Я уменьшаю 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 (возможно, оно недопустимо, но не должно из-за инструкции je)Начальное значение RAX равно 7.

В чем может быть проблема?

Ответы [ 2 ]

6 голосов
/ 01 декабря 2011

Я считаю, что результат умножения хранится в регистре RAX, так что это определенно испортит цикл.

3 голосов
/ 01 декабря 2011

Проблема в том, что вы используете тот же регистр, 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;
}
...