csapp2e 家庭作业 4.45

本文介绍了一个使用C语言实现的冒泡排序算法,通过具体的代码示例展示了如何对整数数组进行排序,并包含了编译后的IA32及Y86汇编语言版本。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

C代码

#include <stdio.h>

void bubble_a(int *data,int count) {  int i,next;  for(next = 1;next < count;next++)  {   for(i = next-1;i >= 0;i--)    if(*(data+i+1) < *(data+i))    {     int t= *(data+i+1);     *(data+i+1) = *(data+i);     *(data+i) = t;    }  } }

int main() {  int i;  int data[10]={54,63,0,-12,45,34523,34,-4,0,345};  bubble_a(data,10);  for(i=0;i<10;i++)  {   printf("%d ",*(data+i));  } }


 

IA32

	.file	"54.c"
	.text
.globl bubble_a
	.type	bubble_a, @function
bubble_a:
	pushl	%ebp
	movl	%esp, %ebp
	subl	$16, %esp
	movl	$1, -8(%ebp)
	jmp	.L2
.L6:
	movl	-8(%ebp), %eax
	subl	$1, %eax
	movl	%eax, -12(%ebp)
	jmp	.L3
.L5:
	movl	-12(%ebp), %eax
	addl	$1, %eax
	sall	$2, %eax
	addl	8(%ebp), %eax
	movl	(%eax), %edx
	movl	-12(%ebp), %eax
	sall	$2, %eax
	addl	8(%ebp), %eax
	movl	(%eax), %eax
	cmpl	%eax, %edx
	jge	.L4
	movl	-12(%ebp), %eax
	addl	$1, %eax
	sall	$2, %eax
	addl	8(%ebp), %eax
	movl	(%eax), %eax
	movl	%eax, -4(%ebp)
	movl	-12(%ebp), %eax
	addl	$1, %eax
	sall	$2, %eax
	addl	8(%ebp), %eax
	movl	-12(%ebp), %edx
	sall	$2, %edx
	addl	8(%ebp), %edx
	movl	(%edx), %edx
	movl	%edx, (%eax)
	movl	-12(%ebp), %eax
	sall	$2, %eax
	addl	8(%ebp), %eax
	movl	-4(%ebp), %edx
	movl	%edx, (%eax)
.L4:
	subl	$1, -12(%ebp)
.L3:
	cmpl	$0, -12(%ebp)
	jns	.L5
	addl	$1, -8(%ebp)
.L2:
	movl	-8(%ebp), %eax
	cmpl	12(%ebp), %eax
	jl	.L6
	leave
	ret
	.size	bubble_a, .-bubble_a
	.section	.rodata
.LC0:
	.string	"%d "
	.text
.globl main
	.type	main, @function
main:
	pushl	%ebp
	movl	%esp, %ebp
	andl	$-16, %esp
	subl	$64, %esp
	movl	$54, 20(%esp)
	movl	$63, 24(%esp)
	movl	$0, 28(%esp)
	movl	$-12, 32(%esp)
	movl	$45, 36(%esp)
	movl	$34523, 40(%esp)
	movl	$34, 44(%esp)
	movl	$-4, 48(%esp)
	movl	$0, 52(%esp)
	movl	$345, 56(%esp)
	movl	$10, 4(%esp)
	leal	20(%esp), %eax
	movl	%eax, (%esp)
	call	bubble_a
	movl	$0, 60(%esp)
	jmp	.L9
.L10:
	movl	60(%esp), %eax
	leal	0(,%eax,4), %edx
	leal	20(%esp), %eax
	addl	%edx, %eax
	movl	(%eax), %edx
	movl	$.LC0, %eax
	movl	%edx, 4(%esp)
	movl	%eax, (%esp)
	call	printf
	addl	$1, 60(%esp)
.L9:
	cmpl	$9, 60(%esp)
	jle	.L10
	leave
	ret
	.size	main, .-main
	.ident	"GCC: (GNU) 4.4.7 20120313 (Red Hat 4.4.7-3)"
	.section	.note.GNU-stack,"",@progbits


 

Y86

	.file	"54.c"
	.text
.globl bubble_a
	.type	bubble_a, @function
bubble_a:
	pushl	%ebp
	rrmovl	%esp, %ebp
	irmovl $16,%esi
	subl	%esi, %esp
	irmovl $1,%esi
	rmmovl	%esi, -8(%ebp)
	jmp	.L2
.L6:
	mrmovl	-8(%ebp), %eax
	irmovl $1,%esi
	subl	%esi, %eax
	rmmovl	%eax, -12(%ebp)
	jmp	.L3
.L5:
	mrmovl	-12(%ebp), %eax
	irmovl $1,%esi
	addl	%esi, %eax
	addl %eax,%eax
	addl %eax,%eax
	mrmovl 8(%ebp),%esi
	addl	%esi, %eax
	mrmovl	(%eax), %edx
	mrmovl	-12(%ebp), %eax
	addl %eax,%eax
	addl %eax,%eax
	mrmovl 8(%ebp),%esi
	addl	%esi, %eax
	mrmovl	(%eax), %eax
	rrmovl %eax,%esi
	rrmovl %edx,%edi
	subl	%esi,%edi
	jge	.L4
	mrmovl	-12(%ebp), %eax
	irmovl $1,%esi
	addl	%esi, %eax
	addl %eax,%eax
	addl %eax,%eax
	mrmovl 8(%ebp),%esi
	addl	%esi, %eax
	mrmovl	(%eax), %eax
	rmmovl	%eax, -4(%ebp)
	mrmovl	-12(%ebp), %eax
	irmovl $1,%esi
	addl	$esi, %eax
	addl %eax,%eax
	addl %eax,%eax
	mrmovl 8(%ebp),%esi
	addl	%esi, %eax
	mrmovl	-12(%ebp), %edx
	addl %edx,%edx
	addl %edx,%edx
	mrmovl 8(%ebp),%esi
	addl	%esi, %edx
	mrmovl	(%edx), %edx
	rmmovl	%edx, (%eax)
	mrmovl	-12(%ebp), %eax
	addl %eax,%eax
	addl %eax,%eax
	mrmovl 8(%ebp),%esi
	addl	%esi, %eax
	mrmovl	-4(%ebp), %edx
	rmmovl	%edx, (%eax)
.L4:
	irmovl $1,%esi
	mrmovl -12(%ebp),%edi
	subl %esi,%edi
	rmmovl %edi, -12(%ebp)
.L3:
	irmovl $0,%esi
	mrmovl -12(%ebp),%edi
	subl %esi,%edi
	jns	.L5
	irmovl $1,%esi
	mrmovl  -8(%ebp),%edi
	addl %esi,%edi
	rmmovl %edi, -8(%ebp)
.L2:
	mrmovl	-8(%ebp), %eax
	mrmovl 12(%ebp),%esi
	rrmovl %eax,%edi
	subl %esi, %edi
	jl	.L6
	rrmovl %ebp,%esp
	popl %ebp
	ret
	.size	bubble_a, .-bubble_a
	.section	.rodata
.LC0:
	.string	"%d "
	.text
.globl main
	.type	main, @function
main:
	pushl	%ebp
	rrmovl	%esp, %ebp
	irmovl $-16,%esi
	andl	%esi, %esp
	irmovl $64,%esi
	subl	%esi, %esp
	irmovl $54,%esi
	rmmovl	%esi, 20(%esp)
	irmovl $63,%esi
	rmmovl	%esi, 24(%esp)
	irmovl $0,%esi
	rmmovl	%esi, 28(%esp)
	irmovl $-12,%esi
	rmmovl	%esi, 32(%esp)
	irmovl $45,%esi
	rmmovl	%esi, 36(%esp)
	irmovl $34523,%esi
	rmmovl	%esi, 40(%esp)
	irmovl $34,%esi
	rmmovl	%esi, 44(%esp)
	irmovl $-4,%esi
	rmmovl	%esi, 48(%esp)
	irmovl $0,%esi
	rmmovl	%esi, 52(%esp)
	irmovl $345,%esi
	rmmovl	%esi, 56(%esp)
	irmovl $10,%esi
	rmmovl	%esi, 4(%esp)
	rrmovl %esp,%eax
	irmovl $20,%esi
	addl %esi,%eax
	rmmovl	%eax, (%esp)
	call	bubble_a
	irmovl $0,%esi
	rmmovl	%esi, 60(%esp)
	jmp	.L9
.L10:
	mrmovl	60(%esp), %eax
	rrmovl %eax,%edx
	addl %edx,%edx
	addl %edx,%edx
	rrmovl %esp,%eax
	irmovl $20,%esi
	addl %esi,%eax
	addl	%edx, %eax
	mrmovl	(%eax), %edx
	rmmovl	$.LC0, %eax
	rmmovl	%edx, 4(%esp)
	rmmovl	%eax, (%esp)
	call	printf
	irmovl $1,%esi
	mrmovl 60(%esp),%edi
	addl	%esi,%edi
	rmmovl %edi,60(%esp);
.L9:
	irmovl $9,%esi
	mrmovl 60(%esp),%edi
	subl %esi,%edi
	jle	.L10
	rrmovl %ebp,%esp
	popl %ebp
	ret
	.size	main, .-main
	.ident	"GCC: (GNU) 4.4.7 20120313 (Red Hat 4.4.7-3)"
	.section	.note.GNU-stack,"",@progbits


 

### CSAPP 第三版家庭作业资源与指导 对于希望深入学习计算机系统结构并完成《Computer Systems: A Programmer's Perspective》(CSAPP)第三版的家庭作业的学生来说,获取合适的资源和支持至关重要。 #### 官方网站支持材料 官方教材配套网站提供了丰富的教学资料,包括幻灯片、实验手册以及针对每章内容设计的具体练习题解答提示。这些资源能够帮助学生更好地理解书中概念,并通过实践巩固所学知识[^2]。 #### 在线社区交流平台 加入专门讨论CSAPP课程的学习小组或论坛也是一个不错的选择。例如,在GitHub上可以找到许多由其他读者创建的相关项目仓库;Reddit中的r/compsci板块也经常有关于该书话题的帖子。这类平台上活跃着大量具有相同兴趣爱好的同学和技术爱好者,大家可以在这里分享见解、解决问题共同进步[^1]。 #### 编程挑战网站 LeetCode、HackerRank等在线编程竞赛平台上有不少题目可以直接对应到CSAPP各章节的知识点之上。利用好此类服务不仅可以提高编码能力,还能加深对底层硬件机制的理解程度。特别是那些涉及位运算操作或是内存管理方面的考题特别有助于复习准备CSAPP课后的习作部分[^3]。 ```c // 示例:实现mul3div4函数来计算3 * x / 4的结果 int mul3div4(int x) { // 计算3*x可能会溢出的情况 x = x + (x << 1); int k = 2; int add = x >> (sizeof(x)*8 - 1); // 获取最高有效位作为符号扩展依据 // 构造掩码用于处理负数情况下的正确移位 int mask = add << k; add &= ~mask; return (x + add) >> k; } ```
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值