CSAPP 练习题4.4
用Y86-64来实现一个递归求和函数:如下
long rsum(long *start, long count) {
if (count <= 0)
return 0;
return *start + rsum(start+1,count-1);
}
解答:
```Y86-64
#long rsum(long *start,long count)
#start in %rdi, count in %rsi
rsum:
xorq %rax, %rax
andq %rsi, %rsi
je return
irmovq $1, %r10
subq %r10, %rsi
pushq %rbx
mrmovq (%rdi), %rbx
irmovq $8, %r10
addq %r10, %rdi
call rsum
addq %rbx, %rax
popq %rbx
return:
ret
```Y86-64
整体思路没问题,压栈保留rbx的上一个值,然后获取内存位置(rdi)处的start值赋给rbx 也就是当前指针指向的数组元素,自减count值(数组长度),然后指针指向下一个地址,递归调用函数体,数组越界后,子函数ret,return的rax加上当前rbx