Я изучаю ассемблер, и у меня есть эта функция, содержащая несколько строк, которые я просто не понимаю:
. globl
. text
factR:
cmpl $0 ,4(% esp )
jne cont
movl $1 ,%eax
ret
cont :
movl 4(%esp),%eax
decl %eax
pushl %eax // (1)
call factR // (2)
addl $4,%esp // (3)
imull 4(%esp),%eax
ret
и соответствующий ему код C:
int factR ( int n ) {
if ( n != 0 )
return n;
else
return n ∗ factR ( n − 1 );
}
Я не уверен насчет линий, помеченных цифрами.
pushl %eax
: означает ли это, что мы помещаем содержимое %eax
в
%esp
Итак, мы называем factR()
. Будет ли результат этого в %esp
, когда мы вернемся сюда к следующим инструкциям?
addl $4,%esp
не уверены насчет этого, мы добавляем 4 к числу, хранящемуся в %esp
, или мы добавляем 4 к указателю, чтобы получить следующий номер или что-то подобное?