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
相关推荐
我在人间贩卖青春6 小时前
汇编之分支跳转指令
汇编·arm·分支跳转
我在人间贩卖青春9 小时前
汇编之加载存储指令
汇编·arm·寄存器加载存储
我在人间贩卖青春9 小时前
汇编之状态寄存器访问指令
汇编·arm·状态寄存器
我在人间贩卖青春9 小时前
汇编之软中断指令和协处理指令
汇编·arm·软中断·协处理
我在人间贩卖青春11 小时前
汇编之数据处理指令
汇编·arm·数据处理指令
白太岁2 天前
操作系统开发:(11) RTOS 与 GPOS 的分界线:MMU
c语言·开发语言·汇编·arm开发·系统架构
枷锁—sha2 天前
【pwn系列】Pwndbg 汇编调试实操教程
网络·汇编·笔记·安全·网络安全
白太岁3 天前
C++:(4) 内存布局、编译流程、关键字及其链接性
c语言·汇编·jvm·c++
real_ben_ladeng5 天前
程序人生—Hello’s P2P 2dc736403375808d93f9c97fc816f2f8
c语言·汇编·硬件架构
切糕师学AI5 天前
ARM标准汇编(armasm)中的“定义”(Assembler Directive)
汇编·arm开发