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
相关推荐
2501_918126918 小时前
nes游戏语言是6502,有没有一种方法可以实现,开发另一种更高效的汇编语言,替代6052,并本土化,弯道超过nes的底层语言?
汇编·硬件工程·个人开发
啊森要自信9 小时前
【C语言】 C语言文件操作
c语言·开发语言·汇编·stm32·单片机
云qq10 小时前
x86操作系统19——键盘驱动
linux·c语言·汇编
_Voosk13 小时前
C指针存储字符串为何不能修改内容
c语言·开发语言·汇编·c++·蓝桥杯·操作系统
天途小编16 小时前
融合空域相关法规核心条款汇编
汇编·无人机
天途小编16 小时前
无人机相关国家根本条例核心汇编
汇编·无人机
2301_789015622 天前
C++:模板进阶
c语言·开发语言·汇编·c++
Hollis Arthur3 天前
mips栈帧详解
开发语言·汇编·学习·mips
fengye2071613 天前
板凳----------(枯藤 )vs2019+win10(第四章-3)
汇编
white-persist6 天前
【攻防世界】reverse | re1-100 详细题解 WP
c语言·开发语言·网络·汇编·python·算法·网络安全