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 %rbpmovq %rsp, %rbppushq %rbxsubq $24, %rspmovq %rdi, -24(%rbp)movq %rsi, -32(%rbp)cmpq $0, -32(%rbp)jg .L2movl $0, %eaxjmp .L3
.L2:movq -24(%rbp), %raxmovq (%rax), %rbxmovq -32(%rbp), %raxleaq -1(%rax), %rdxmovq -24(%rbp), %raxaddq $8, %raxmovq %rdx, %rsimovq %rax, %rdicall rsumaddq %rbx, %rax
.L3:movq -8(%rbp), %rbxleaveret
答案
Leave等价于:
movl %ebp %esp
popl %ebp