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 天前
操作系统开发:(9) 从硬件复位到程序执行:如何编写符合硬件动作的启动文件与链接脚本
c语言·汇编·嵌入式硬件·系统架构
欧恩意2 天前
【Tools】Java反汇编工具推荐
java·汇编
学习3人组3 天前
X86汇编PUSH与POP操作对于变量在内存中高低地址的转换分析
汇编
188号安全攻城狮6 天前
【请假,后面补】WinDbg 核心调试操作
汇编·安全·网络安全
万法若空9 天前
8086/8088实模式的内存布局
汇编
浩浩测试一下10 天前
内网---> WriteOwner权限滥用
网络·汇编·windows·安全·microsoft·系统安全
一品人家11 天前
win32汇编使用GDI+入门教程之九
汇编·windows·win32汇编
虚构之人11 天前
二进制漏洞挖掘(WinAFL Fuzzing)Windows篇
汇编·网络安全·信息安全·系统安全
一品人家13 天前
win32汇编使用GDI+入门教程之六
汇编·windows·win32汇编
前端菜鸟日常14 天前
鸿蒙开发实战:100 个项目疑难杂症汇编
汇编·华为·harmonyos