CSAPP:archlab

先来一个疲惫却快乐的笑容 🙂
期末的archlab…神一般的存在
上上周开开心心写完Part A,Part B已经在作业里做过了
感觉这个lab真是友好呀!!
然而今天死磕了一天Part C(手动狗头
anyway,终于做完了还是好开心滴!!
最后一个lab和期末都要好好加油呀😆

Part A

这一部分还是考验编写汇编的能力
要把examples.c的三个函数编写成Y86的汇编语言
一开始我还先把他们转化成x86的汇编再进行改写
后来发现真是太复杂了,因为函数的功能都相当简单,直接写就可以了
& 需要学习一下模式化的开栈和调用等操作(写多了就熟悉啦,这里参考了网络~)

sum_list.ys
根据上上周遗留下来的上古遗迹来看,就大致是这样的
在这里插入图片描述
在栈中以这样的形式进行依次相加
在这里插入图片描述在这里插入图片描述

测试:
在这里插入图片描述
rsum_list.ys
功能与第一个相同,只是需要使用递归
要注意递归时的栈推入写法
在这里插入图片描述

测试:
在这里插入图片描述
copy.ys
复制并计算链表
在这里插入图片描述

测试:
在这里插入图片描述

Part B

这个我们之前做过作业啦~感觉也不是很难,只要明白指令过程就OK
直接贴作业了hh
在这里插入图片描述

seq-full.hcl 修改处
################ Fetch Stage     ###################################

bool instr_valid = icode in 
	{ IIADDQ, INOP, IHALT, IRRMOVQ, IIRMOVQ, IRMMOVQ, IMRMOVQ,
	       IOPQ, IJXX, ICALL, IRET, IPUSHQ, IPOPQ };

# Does fetched instruction require a regid byte?
bool need_regids =
	icode in { IIADDQ, IRRMOVQ, IOPQ, IPUSHQ, IPOPQ, 
		 IIRMOVQ, IRMMOVQ, IMRMOVQ };

# Does fetched instruction require a constant word?
bool need_valC =
	icode in { IIRMOVQ, IIADDQ, IRMMOVQ, IMRMOVQ, IJXX, ICALL };

################ Decode Stage    ###################################

## What register should be used as the B source?
word srcB = [
	icode in { IOPQ, IRMMOVQ, IMRMOVQ, IIADDQ  } : rB;
	icode in { IPUSHQ, IPOPQ, ICALL, IRET } : RRSP;
	1 : RNONE;  # Don't need register
];

## What register should be used as the E destination?
word dstE = [
	icode in { IRRMOVQ } && Cnd : rB;
	icode in { IIRMOVQ, IOPQ, IIADDQ } : rB;
	icode in { IPUSHQ, IPOPQ, ICALL, IRET } : RRSP;
	1 : RNONE;  # Don't write any register
];

################ Execute Stage   ###################################

## Select input A to ALU
word aluA = [
	icode in { IRRMOVQ, IOPQ } : valA;
	icode in { IIRMOVQ, IRMMOVQ, IMRMOVQ, IIADDQ } : valC;
	icode in { ICALL, IPUSHQ } : -8;
	icode in { IRET, IPOPQ } : 8;
	# Other instructions don't need ALU
];

## Select input B to ALU
word aluB = [
	icode in { IRMMOVQ, IMRMOVQ, IOPQ, ICALL, 
		      IPUSHQ, IRET, IPOPQ, IIADDQ } : valB;
	icode in { IRRMOVQ, IIRMOVQ } : 0;
	# Other instructions don't need ALU
];

## Should the condition codes be updated?
bool set_cc = icode in { IOPQ, IIADDQ };

测试:
在这里插入图片描述

Part C

来了,PartC终于来了
这题就是让你尽可能快的优化ncopy.ys
初看它的代码,确实有很多不好的地方,但是你把它改掉之后…
就是0分…
所以真的没那么简单,需要自学第五章的优化方法(真实)
所以这里采用了如下的方法:
1.为pipe-full.hcl增加IAAQ指令,可以优化加法的速度,方法与Part B相同
2.使用第五章的split循环的方法,依次循环操作8个数字,减少循环的次数
3.在取数字时一次取出两个,既防止了bubble的发生(似乎这里是数据冒险??),也获得了下一步操作的数据
4.修改了原来的判断jg/jle,使得效率提升
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
个人觉得最重要的是拆分循环+去bubble的想法~
参考了大佬的思路,万分感谢!!
各种测试:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在完成了1、2、3的优化后,进行的benchmark:
在这里插入图片描述
在优化了jle/jg判断后的benchmark:(也太不容易了555)
在这里插入图片描述

还有个卡了一下午的bug!!
不知道为什么…benchmark会全是7,而且regression测试都是错的……😭
在这里插入图片描述
真的很有趣…这个bug最后给你的成绩是60(手动微笑
无论怎么make drivers都无效啊…一度崩溃
最后似乎是莫名其妙的进行了下

make passim VERSION=full

然后出现了这堆东西,就OK了
在这里插入图片描述


这个lab的时间很短,做的也有些拖沓和匆忙
但是从Part C真的可以看出CMU老师的牛🍺了
没拿到满分,但已经学到很多啦,特别是优化程序的思路,下学期也是要学习的
最后一个lab冲冲冲!!

  • 4
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值