Architecture Lab:预备知识2【汇编call/leave/ret指令、CS:APP练习4.4】

chap4的练习4.4(page.255)让用Y86-64实现rsum(递归求数组元素之和),提示为:先得到x86-64汇编代码,然后转换成Y86-64的

这是rsum的c实现:

cpp 复制代码
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
相关推荐
会讲英语的码农1 小时前
MCS-51汇编
汇编·嵌入式硬件·51单片机
洛寒瑜2 天前
【读书笔记-《30天自制操作系统》-23】Day24
开发语言·汇编·笔记·操作系统·应用程序
m0_714590262 天前
汇编(实现C语言程序的调用)
c语言·开发语言·汇编
晴友读钟2 天前
速通汇编(七)BX、SI、DI寄存器,BP寄存器,直接寻址和间接寻址
汇编
流殇2582 天前
ARM中要使用的汇编基础
汇编·arm开发
2401_858286113 天前
汇编实现从1加到1000(《X86汇编语言 从实模式到保护模式(第2版》) 第135页第2题解答)
汇编·nasm·汇编语言·x86·virtualbox·8086·virtual box
xiaozhiwise3 天前
ARM32 base instruction -- blx
汇编
Freestyle Coding3 天前
使用rust自制操作系统内核
c语言·汇编·microsoft·rust·操作系统
向你扔鸡爪4 天前
29912分页
汇编·windows
2401_858286115 天前
51.【C语言】字符函数和字符串函数(strcpy函数)
c语言·开发语言·汇编