实验内容

实验提供了一个Y86-64处理器,要求我们编写汇编、添加处理器指令、优化汇编程序。

注意在make时如果出现 tk.h: No such file or directory 这样的报错,需要进Makefile根据指示注释掉几行代码。

PartA

第一部分要求我们根据提供的C程序,编写对应汇编程序。在misc目录下make得到的yas可以把汇编程序转换为相应的机器码,yis可以模拟机器码在Y86-64处理器上的执行。

/* linked list element */
typedef struct ELE {long val;struct ELE *next;
} *list_ptr;

Y86-64上的汇编指令比较少,在书上都有提供,编写下来比较简单,别忘了整个程序前后的声明即可。

/* sum_list - Sum the elements of a linked list */
long sum_list(list_ptr ls)
{long val = 0;while (ls) {val += ls->val;ls = ls->next;}return val;
}# Execution begins at address 0.pos 0irmovq stack, %rspcall mainhalt.align 8# Source block
src:.quad 0x00a.quad 0x0b0.quad 0xc00# Destination block
dest:.quad 0x111.quad 0x222.quad 0x333main:irmovq $3, %rdxirmovq dest, %rsiirmovq src, %rdicall copy_blockretcopy_block:irmovq $8, %r8irmovq $0xffffffffffffffff, %r9xorq %rax, %raxloop:andq %rdx, %rdxje endmrmovq (%rdi), %r10rmmovq %r10, (%rsi)xorq %r10, %raxaddq %r8, %rdiaddq %r8, %rsiaddq %r9, %rdxjmp loopend:ret# Stack starts here.pos 0x200
stack:
/* rsum_list - Recursive version of sum_list */
long rsum_list(list_ptr ls)
{if (!ls)return 0;else {long val = ls->val;long rest = rsum_list(ls->next);return val + rest;}
}main:irmovq ele1, %rdicall rsum_listretrsum_list:irmovq $8, %r8xorq %rax, %raxandq %rdi, %rdije endmrmovq (%rdi), %r9addq %r8, %rdimrmovq (%rdi), %rdipushq %r9call rsum_listpopq %r9addq %r9, %raxend:ret
/* copy_block - Copy src to dest and return xor checksum of src */
long copy_block(long *src, long *dest, long len)
{long result = 0;while (len > 0) {long val = *src++;*dest++ = val;result ^= val;len--;}return result;
}main:irmovq ele1, %rdicall sum_listretsum_list: irmovq $8, %r8xorq %rax, %raxjmp testloop:mrmovq (%rdi), %r9addq %r9, %raxaddq %r8, %rdi  #指针移动到next的位置mrmovq (%rdi), %rdijmp testtest:andq %rdi, %rdi #测试%rdi是否为0jne loopret

运行程序后将寄存器的值与文档里的值进行对比即可。

PartB

这一部分需要修改seq里的硬件描述文件seq-full.c,添加一条iaddq指令,实现立即数和整数的加法运算。需要添加的部分有:

#有效指令
bool instr_valid = icode in { INOP, IHALT, IRRMOVQ, IIRMOVQ, IRMMOVQ, IMRMOVQ,IOPQ, IJXX, ICALL, IRET, IPUSHQ, IPOPQ, IIADDQ };#需要寄存器
bool need_regids =icode in { IRRMOVQ, IOPQ, IPUSHQ, IPOPQ, IIRMOVQ, IRMMOVQ, IMRMOVQ, IIADDQ };#有立即数valC
bool need_valC =icode in { IIRMOVQ, IRMMOVQ, IMRMOVQ, IJXX, ICALL, IIADDQ };#srcB是寄存器值rB
word srcB = [icode in { IOPQ, IRMMOVQ, IMRMOVQ, IIADDQ  } : rB;icode in { IPUSHQ, IPOPQ, ICALL, IRET } : RRSP;1 : RNONE;  # Don't need register
];#寄存器的写入位置为rB
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
];#ALU的计算符号位Add
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
];#ALU的B值位valB,即为寄存器rB
word aluB = [icode in { IRMMOVQ, IMRMOVQ, IOPQ, ICALL, IPUSHQ, IRET, IPOPQ, IIADDQ } : valB;icode in { IRRMOVQ, IIRMOVQ } : 0;# Other instructions don't need ALU
];#计算后需要设置条件码
bool set_cc = icode in { IOPQ, IIADDQ };

随后根据文档里的要求进行程序测试即可。

PartC

这一部分给定了一个ncopy.ys的汇编代码,运行在一个流水线处理器上。要求我们修改ncopy.ys,使其性能尽可能的好,CPE越低,分数越高。

首先需要为这个处理器添加iaddq指令,大致内容与PartB相同,后面需要用到iaddq设置条件码来进行判断。

然后就是对ncopy.ys进行修改,未修改的ncopy.ys内容如下:

    xorq %rax,%rax       # count = 0;andq %rdx,%rdx     # len <= 0?jle Done     # if so, goto Done:Loop:    mrmovq (%rdi), %r10 # read val from src...rmmovq %r10, (%rsi)   # ...and store it to dstandq %r10, %r10     # val <= 0?jle Npos     # if so, goto Npos:irmovq $1, %r10addq %r10, %rax       # count++
Npos:   irmovq $1, %r10subq %r10, %rdx      # len--irmovq $8, %r10addq %r10, %rdi       # src++addq %r10, %rsi        # dst++andq %rdx,%rdx     # len > 0?jg Loop            # if so, goto Loop:

我做的时候用了两种优化方法:

第一种为错开一部分指令,避免因为load/use才产生的气泡。

第二种为循环展开,由于ncopy最多只能用1000字节,所以循环展开的路数不能太大。这里我的展开方式为12路——4路——2路——1路。即先每12个元素并为一个循环,如果元素个数不满12,则每4个元素并为一个循环......

##################################################################
# You can modify this portion#对%rbx进行iaddq测试是否大于等于12rrmovq %rdx, %rbx L12:iaddq $-12, %rbxjl Start4#12路展开,错开部分指令避免Load/Use
l12_1:mrmovq (%rdi), %r8mrmovq $0x8(%rdi), %r9rmmovq %r8, (%rsi)andq %r8, %r8jle l12_2iaddq $0x1, %raxl12_2:mrmovq $0x10(%rdi), %r10rmmovq %r9, $0x8(%rsi)andq %r9, %r9jle l12_3iaddq $0x1, %raxl12_3:mrmovq $0x18(%rdi), %r8andq %r10, %r10rmmovq %r10, $0x10(%rsi)jle l12_4iaddq $0x1, %raxl12_4:mrmovq $0x20(%rdi), %r9andq %r8, %r8rmmovq %r8, $0x18(%rsi)jle l12_5iaddq $0x1, %raxl12_5:mrmovq $0x28(%rdi), %r10andq %r9, %r9rmmovq %r9, $0x20(%rsi)jle l12_6iaddq $0x1, %raxl12_6:mrmovq $0x30(%rdi), %r8andq %r10, %r10rmmovq %r10, $0x28(%rsi)jle l12_7iaddq $0x1, %raxl12_7:mrmovq $0x38(%rdi), %r9andq %r8, %r8rmmovq %r8, $0x30(%rsi)jle l12_8iaddq $0x1, %raxl12_8:mrmovq $0x40(%rdi), %r10andq %r9, %r9rmmovq %r9, $0x38(%rsi)jle l12_9iaddq $0x1, %raxl12_9:mrmovq $0x48(%rdi), %r8andq %r10, %r10rmmovq %r10, $0x40(%rsi)jle l12_10iaddq $0x1, %raxl12_10:mrmovq $0x50(%rdi), %r9andq %r8, %r8rmmovq %r8, $0x48(%rsi)jle l12_11iaddq $0x1, %raxl12_11:mrmovq $0x58(%rdi), %r10andq %r9, %r9rmmovq %r9, $0x50(%rsi)jle l12_12iaddq $0x1, %raxl12_12:andq %r10, %r10rmmovq %r10, $0x58(%rsi)jle l12_13iaddq $0x1, %raxl12_13:iaddq $-12, %rdxiaddq $0x60, %rdiiaddq $0x60, %rsijmp L12Start4:rrmovq %rdx, %rbxL4:iaddq $-4, %rbxjl Start2l4_1:mrmovq (%rdi), %r8mrmovq $0x8(%rdi), %r9andq %r8, %r8rmmovq %r8, (%rsi)jle l4_2iaddq $0x1, %raxl4_2:mrmovq $0x10(%rdi), %r10andq %r9, %r9rmmovq %r9, $0x8(%rsi)jle l4_3iaddq $0x1, %raxl4_3:mrmovq $0x18(%rdi), %r8andq %r10, %r10rmmovq %r10, $0x10(%rsi)jle l4_4iaddq $0x1, %raxl4_4:andq %r8, %r8rmmovq %r8, $0x18(%rsi)jle l4_5iaddq $0x1, %raxl4_5:iaddq $-4, %rdxiaddq $0x20, %rdiiaddq $0x20, %rsijmp L4Start2:rrmovq %rdx, %rbxL2:iaddq $-2, %rbxjl Start1l2_1:mrmovq (%rdi), %r8mrmovq $0x8(%rdi), %r9andq %r8, %r8rmmovq %r8, (%rsi)jle l2_2iaddq $0x1, %raxl2_2:andq %r9, %r9rmmovq %r9, $0x8(%rsi)jle l2_3iaddq $0x1, %raxl2_3:iaddq $-2, %rdxiaddq $0x10, %rdiiaddq $0x10, %rsijmp L2#从2路转到1路说明最多只剩一个元素待copy了
Start1:mrmovq (%rdi), %r8andq %rdx, %rdxjle Donermmovq %r8, (%rsi)andq %r8, %r8jle Doneiaddq $0x1, %rax##################################################################

上面有些指令旁路即可解决相关,但是还是被我错开了(在写完了才发现,不想改回来了),不过不影响性能。

./correctness.pl测试正确性:

./benchmark.pl测试性能:

后面琢磨了一下,想要优化得更好,可能还需要改变一下循环展开的路数和层级。

CSAPP ArchLab相关推荐

  1. CSAPP: Architecture Lab

    介绍 本实验是将CSAPP家庭作业后面的几个问题组合成实验作业.在实验中,我们需要修改处理器的HCL描述来增加新的指令.修改循环策略等,修改后的处理器能够被模拟,并通过运行自动化测试检测. 在本实验中 ...

  2. csapp 、sicp 、深入理解计算机系统、 计算机程序的构造和解释

    CSAPP 第一版的英文版 深入理解计算机系统第一版中文版  这个是csdn账号  这里上传文件大小在10M以内  这个pdf是19+M的 深入理解计算机系统第二版的中文版下载 第一版英文版的介绍原书 ...

  3. CSAPP第五章就在“扯淡”!

    "你的时间有限,所以不要为别人而活.不要被教条所限,不要活在别人的观念里.不要让别人的意见左右自己内心的声音.最重要的是,勇敢的去追随自己的心灵和直觉,只有自己的心灵和直觉才知道你自己的真实 ...

  4. csapp:无符号数可能造成的程序bug

    出自csapp练习2.26 size_t strlen(const char *s); int strloner(char *s,char *t) {return strlen(s)-strlen(t ...

  5. 链接器(linker)的作用——CSAPP第7章读书笔记

    首先说说我为什么要去读这一章.这个学期开OS的课,在Morden Operating System上读到和Process有关的内容时看到这样一句话:"Process is fundament ...

  6. CSAPP:第三章程序的机器级表示1

    CSAPP:程序的机器级表示1 关键点:数据格式.操作数指示符. 数据格式访问信息操作数指示符举例说明 数据格式   术语字(word)表示16位数据类型,32位数为双字(double words), ...

  7. 【❌❌深入浅出,九浅一深⭕⭕】《深入理解计算机系统》CSAPP

    <计算机系统基础>30' 一.处理器的时序电路 1.CPU中的时序电路 答: CPU中的时序电路:通过RS触发器控制CPU的时序. 2.单周期处理器的设计 答: CPU在处理指令时,一般需 ...

  8. CSAPP:Attack lab

    关注公号[逆向通信猿]更精彩!!! 原文地址:https://www.jianshu.com/p/db731ca57342 本文介绍的是CSAPP书籍中的第三个lab: Attack lab.通过这个 ...

  9. [精品]CSAPP Bomb Lab 解题报告(七)——隐藏关卡

    接上篇[精品]CSAPP Bomb Lab 解题报告(六) gdb常用指令 设置Intel代码格式:set disassembly-flavor intel 查看反汇编代码:disas phase_1 ...

  10. [精品]CSAPP Bomb Lab 解题报告(六)

    接上篇[精品]CSAPP Bomb Lab 解题报告(五) gdb常用指令 设置Intel代码格式:set disassembly-flavor intel 查看反汇编代码:disas phase_1 ...

最新文章

  1. java.lang.NoSuchMethodError: org.springframework.beans.factory.annotation.InjectionMetadata.init(L
  2. java解析url字符串,将字符串解析为URL
  3. LintCode MySQL 1921. 从不充值的玩家(where not in)
  4. 【云计算平台】Hadoop单机模式环境搭建
  5. 编程语言对比 引用数据类型-字典
  6. ThreadLocal类的实现用法
  7. plsql 存储过程 批量提交_新一代的键值存储 KVell SOSP 2019
  8. java测试字符串的编码_Java字符串测验
  9. CSDN在2017年度的若干“升级”
  10. mac iwall 动态桌面引擎
  11. linux 命令无法Tab补全,命令参数无法补全
  12. cygwin解压linux软件,如何在Cygwin上安装unzip | 望天博客
  13. 窦唯与女儿【节选】揭秘男星与女儿之间的奇闻
  14. 航班时间(第九届蓝桥杯省赛C++A组)
  15. 如何查找python各种路径
  16. RecyclerView使用探索1--了解及使用
  17. 中国市场超阿迪耐克 安踏领衔打响国货反击战
  18. Hutool - 简化Java编程的法宝,让工作更高效
  19. 安装lamp服务器系统,LAMP安装环境搭建详解
  20. 有关Linux内核版本命名规则

热门文章

  1. 全球与中国膏体涂抹器市场深度研究分析报告
  2. Arduino Uno 使用 人体红外传感器(HC_SR051)实现 人体感应灯
  3. 每日英语:China Bridge Collapse Raises Infrastructure Concerns
  4. 学习笔记-部署和管理DPM 2016-04文件和应用程序保护
  5. 中国各省存贷款余额(2003-2020年)
  6. 项目验收测试是什么意思?项目检测具体流程有哪些?
  7. 2021-07-07随笔
  8. Mackdown 编辑器-马克飞象
  9. 华为路由交换工程师(VRP基础介绍)
  10. 可爱又能干的小精灵—送餐机器人来啦