本文主要是介绍Architecture Lab:预备知识2【汇编call/leave/ret指令、CS:APP练习4.4】,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
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
这篇关于Architecture Lab:预备知识2【汇编call/leave/ret指令、CS:APP练习4.4】的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!