Ассемблер в Linux для программистов C: различия между версиями

откат, см. обсуждение
(откат, см. обсуждение)
 
Что же здесь изменено? Рекурсия переписана в виде цикла. Кадр стека больше не нужен, так как в стек ничего не перемещается и другие функции не вызываются. Пролог и эпилог поэтому убраны, при этом регистр <code>%ebp</code> не используется вообще. Но если бы он использовался, сначала нужно было бы сохранить его значение, а перед возвратом восстановить.
 
Существует также возможность реализовать вычисление факториала без функций:
<pre>
movl $1, %eax /* Аккумулятор результата. 1 исходное значение, поскольку 0! = 1*/
movl $5, %ebx /* счетчик цикла, по совместительству - то самое (n - 1) */
 
loop_start:
mull %ebx
decl %ebx
 
cmp $0, %ebx
jne loop_start
ret
</pre>
 
Автор увлёкся процессом и написал 64-битную версию этой функции. Она возвращает результат в паре <code>%eax:%edx</code> и может вычислить <math>20! = 2432902008176640000</math>.
401

правка