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