chap4的练习4.4(page.255)让用Y86-64实现rsum(递归求数组元素之和),提示为:先得到x86-64汇编代码,然后转换成Y86-64的
这是rsum的c实现:
long rsum(long *start, long count)
{
if (count <= 0)
return 0;
return *start + rsum(start+1, count-1);
}
命令 gcc -S rsum.c,得到的rsum.s文件即为汇编之后的结果。把这个文件中.(点号)开头的伪指令都去掉,得到以下内容,这就是x86-64指令集实现rsum函数的代码:
rsum:
.LFB0:
pushq %rbp
movq %rsp, %rbp
pushq %rbx
subq $24, %rsp
movq %rdi, -24(%rbp)
movq %rsi, -32(%rbp)
cmpq $0, -32(%rbp)
jg .L2
movl $0, %eax
jmp .L3
.L2:
movq -24(%rbp), %rax
movq (%rax), %rbx
movq -32(%rbp), %rax
leaq -1(%rax), %rdx
movq -24(%rbp), %rax
addq $8, %rax
movq %rdx, %rsi
movq %rax, %rdi
call rsum
addq %rbx, %rax
.L3:
movq -8(%rbp), %rbx
leave
ret
答案
Leave等价于:
movl %ebp %esp
popl %ebp