csapp archlab PartC满分解答

news2024/9/22 19:38:09

任务

修改ncopy.ys和pipe-full.hcl以尽可能的提高ncopy.ys的运行速度

思路

pipe-full.hcl

  1. 实现iaddq指令(家庭作业4.54)
  2. 实现加载转发(家庭作业4.57)

ncopy.ys

  1. 使用循环展开(第5.8节),由于代码长度限制,最终使用十路循环展开
  2. 使用区间判断处理循环展开之后的余数,并利用技巧减少跳转指令
  3. 利用总是选择分支策略的特性控制分支优先级,决定优先级的有两个因素:一是区间越大(发生的概率越大)的分支优先级越大;二是余数越小优先级越大,因为每个长度的成绩是CPE(cycles per element),而综合成绩又是每个长度成绩的平均值
  4. 寄存器默认为零,因此删除xorq %rax, %rax指令不会造成错误

由于采用了十路循环展开,因此余数为[0, 9],由于跳转指令可以为jl,je,jg,因此区间判断的搜索树为一个三叉搜索树,选择3和7进行判断是综合考虑统计因素和余数优先级的结果

未命名文件-1

代码

##################################################################
# You can modify this portion
        # Loop header

# ten-way loop unrolling
        iaddq $-10, %rdx        # len - 10 < 0?
        jl L0R9
Loop1:
        mrmovq (%rdi), %r8      # val = *src
        rmmovq %r8, (%rsi)      # *dst = val
        andq %r8, %r8           # val <= 0?
        jle Loop2               # if so, goto Loop2
        iaddq $1, %rax          # count++
Loop2:
        mrmovq 0x8(%rdi), %r8
        rmmovq %r8, 0x8(%rsi)
        andq %r8, %r8
        jle Loop3
        iaddq $1, %rax
Loop3:
        mrmovq 0x10(%rdi), %r8
        rmmovq %r8, 0x10(%rsi)
        andq %r8, %r8
        jle Loop4
        iaddq $1, %rax
Loop4:
        mrmovq 0x18(%rdi), %r8
        rmmovq %r8, 0x18(%rsi)
        andq %r8, %r8
        jle Loop5
        iaddq $1, %rax
Loop5:
        mrmovq 0x20(%rdi), %r8
        rmmovq %r8, 0x20(%rsi)
        andq %r8, %r8
        jle Loop6
        iaddq $1, %rax
Loop6:
        mrmovq 0x28(%rdi), %r8
        rmmovq %r8, 0x28(%rsi)
        andq %r8, %r8
        jle Loop7
        iaddq $1, %rax
Loop7:
        mrmovq 0x30(%rdi), %r8
        rmmovq %r8, 0x30(%rsi)
        andq %r8, %r8
        jle Loop8
        iaddq $1, %rax
Loop8:
        mrmovq 0x38(%rdi), %r8
        rmmovq %r8, 0x38(%rsi)
        andq %r8, %r8
        jle Loop9
        iaddq $1, %rax
Loop9:
        mrmovq 0x40(%rdi), %r8
        rmmovq %r8, 0x40(%rsi)
        andq %r8, %r8
        jle Loop10
        iaddq $1, %rax
Loop10:
        mrmovq 0x48(%rdi), %r8
        rmmovq %r8, 0x48(%rsi)
        andq %r8, %r8
        jle Step
        iaddq $1, %rax
Step:
        iaddq $0x50, %rdi
        iaddq $0x50, %rsi
        iaddq $-10, %rdx
        jge Loop1

# applying range checks to remainders
L0R9:
        iaddq   $7,%rdx         # Test 3 (len + 10 - 3)
        jl      L0R2            # len < 3
        jg      L4R9            # len > 3
        je      Rem3            # len == 3
L0R2:
        iaddq   $2,%rdx         # Test 1 (len + 3 - 1)
        je      Rem1            # len == 1
        jg      Rem2            # len == 2
        ret                     # len == 0
L4R6:
        iaddq   $2,%rdx         # Test 5 (len + 7 - 5)
        jl      Rem4            # len == 4
        je      Rem5            # len == 5
        jmp     Rem6            # len == 6
L4R9:
        iaddq   $-4,%rdx        # Test 7 (len + 3 - 7)
        jl      L4R6            # len < 7
        je      Rem7            # len == 7
L8R9:
        iaddq   $-1,%rdx        # Test 8 (len + 7 - 8)
        je      Rem8            # len == 8

# dealing with remainders
Rem9:
        mrmovq 0x40(%rdi), %r8
        rmmovq %r8, 0x40(%rsi)
        andq %r8, %r8
        jle Rem8
        iaddq $1, %rax
Rem8:
        mrmovq 0x38(%rdi), %r8
        rmmovq %r8, 0x38(%rsi)
        andq %r8, %r8
        jle Rem7
        iaddq $1, %rax
Rem7:
        mrmovq 0x30(%rdi), %r8
        rmmovq %r8, 0x30(%rsi)
        andq %r8, %r8
        jle Rem6
        iaddq $1, %rax
Rem6:
        mrmovq 0x28(%rdi), %r8
        rmmovq %r8, 0x28(%rsi)
        andq %r8, %r8
        jle Rem5
        iaddq $1, %rax
Rem5:
        mrmovq 0x20(%rdi), %r8
        rmmovq %r8, 0x20(%rsi)
        andq %r8, %r8
        jle Rem4
        iaddq $1, %rax
Rem4:
        mrmovq 0x18(%rdi), %r8
        rmmovq %r8, 0x18(%rsi)
        andq %r8, %r8
        jle Rem3
        iaddq $1, %rax
Rem3:
        mrmovq 0x10(%rdi), %r8
        rmmovq %r8, 0x10(%rsi)
        andq %r8, %r8
        jle Rem2
        iaddq $1, %rax
Rem2:
        mrmovq 0x8(%rdi), %r8
        rmmovq %r8, 0x8(%rsi)
        andq %r8, %r8
        jle Rem1
        iaddq $1, %rax
Rem1:
        mrmovq (%rdi), %r8
        rmmovq %r8, (%rsi)
        andq %r8, %r8
        jle Done
        iaddq $1, %rax

##################################################################
# Do not modify the following section of code
# Function epilogue.
Done:
        ret
##################################################################
# Keep the following label at the end of your function
End:
#/* $end ncopy-ys */

实验成绩

未命名文件-2未命名文件-3

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/901583.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python将本地文件上传到百度网盘

Python将本地文件上传到百度网盘 前言相关介绍Python将本地文件上传到百度网盘下载相关依赖库获取授权打开链接复制授权码粘贴授权码到终端&#xff0c;并回车连接到百度网盘 上传文件文件同步上传文件夹下载文件夹 前言 由于本人水平有限&#xff0c;难免出现错漏&#xff0c;…

Golang文件操作详解

打开和关闭文件 从 Go 1.16 开始,现在提供了相同的功能 通过包 IO 或包操作系统,以及这些实现 应该在新代码中首选。 有关详细信息,请参阅特定函数文档。 弃用了"io/ioutil"对文件的操作 读取文件方法一(os.open+file.read只读形式): os.Open() 函数能够打开…

攻防世界-Web_python_template_injection

原题解题思路 一说到python的web我就想到flask框架&#xff0c;但从没用过flask注入。 从零学习flask模板注入&#xff0c;这篇文章有详细的介绍。 经过尝试很快就能发现使用{{}}就能注入&#xff0c;并且会回显报错信息&#xff0c;3的位置是{{}}中语句的执行结果。 找可用的引…

T113-S3-LAN8720A网口phy芯片调试

目录 前言 一、LAN8720A介绍 二、原理图连接 三、设备树配置 四、内核配置 五、调试问题 总结 前言 在嵌入式系统开发中&#xff0c;网络连接是至关重要的一部分。T113-S3开发板搭载了LAN8720A系列的网口PHY芯片&#xff0c;用于实现以太网连接。在开发过程中&#xff0c…

STC15单片机PM2.5空气质量检测仪

一、系统方案 本设计采用STC15单片机作为主控制器&#xff0c;PM2.5传感器、按键设置&#xff0c;液晶1602显示&#xff0c;蜂鸣器报警。 二、硬件设计 原理图如下&#xff1a; 三、单片机软件设计 1、首先是系统初始化&#xff1a; void lcd_init()//液晶初始化设置 { de…

C#程序变量统一管理例子 - 开源研究系列文章

今天讲讲关于C#应用程序中使用到的变量的统一管理的代码例子。 我们知道&#xff0c;在C#里使用变量&#xff0c;除了private私有变量外&#xff0c;程序中使用到的公共变量就需要进行统一的存放和管理。这里笔者使用到的公共变量管理库划分为&#xff1a;1)窗体&#xff1b;2)…

熔断降级的理解和基于feign的熔断降级

什么是熔断降级&#xff1a; 在微服务保护中我们使用sentinel进行了熔断降级&#xff0c;熔断降级时为了防止雪崩效应&#xff0c;什么是雪崩效应&#xff0c;因为微服务是一层调用一层的&#xff0c;如果下面某一个微服务宕机了&#xff0c;就会导致全部的微服务宕机&#xf…

【欧拉计划】3或5的倍数

题目链接&#xff1a;3或5的倍数 解法一&#xff1a;暴力枚举 C语言代码 #include<stdio.h> int main (){int sum 0;for(int i 0;i<1000;i){if(i%30 || i%50)sum i;}printf("%d\n",sum);return 0; } //运行结果&#xff1a;233168上面这个解法的时间复杂…

回归预测 | MATLAB实现CSO-BP布谷鸟优化算法优化BP神经网络多输入单输出回归预测(多指标,多图)

回归预测 | MATLAB实现CSO-BP布谷鸟优化算法优化BP神经网络多输入单输出回归预测&#xff08;多指标&#xff0c;多图&#xff09; 目录 回归预测 | MATLAB实现CSO-BP布谷鸟优化算法优化BP神经网络多输入单输出回归预测&#xff08;多指标&#xff0c;多图&#xff09;效果一览…

【BUG】Docker启动MySQL报错

个人主页&#xff1a;金鳞踏雨 个人简介&#xff1a;大家好&#xff0c;我是金鳞&#xff0c;一个初出茅庐的Java小白 目前状况&#xff1a;22届普通本科毕业生&#xff0c;几经波折了&#xff0c;现在任职于一家国内大型知名日化公司&#xff0c;从事Java开发工作 我的博客&am…

Java之继承详解二

3.7 方法重写 3.7.1 概念 方法重写 &#xff1a;子类中出现与父类一模一样的方法时&#xff08;返回值类型&#xff0c;方法名和参数列表都相同&#xff09;&#xff0c;会出现覆盖效果&#xff0c;也称为重写或者复写。声明不变&#xff0c;重新实现。 3.7.2 使用场景与案例…

基于STC15单片机-LM35-DS8B20温度测量-DS1302计时-proteus仿真-源程序

一、系统方案 本设计采用STC15单片机作为主控器。 DS18B20采集温度值送到液晶1602显示。 DS1302计时&#xff0c;日期送到液晶1602显示。 LM35采集另一路温度值送到数码管显示。 二、硬件设计 原理图如下&#xff1a; 三、单片机软件设计 1、首先是系统初始化 /IO初始化为…

Azure应用程序网关

文章目录 什么是应用程序网关实战演练创建虚拟网络创建虚拟机创建应用程序网关测试搭建结果 什么是应用程序网关 Azure应用程序网关是一种托管服务&#xff0c;用于提供安全、可缩放的 Web 应用程序前端点的应用程序传送控制和保护。它可以通过 SSL 终止、cookie 基于会话持久…

adb devices存在连接emulator-5554怎么办

执行adb kill-server 发现还是有5554这条数据&#xff0c;可以采用window杀死端口号的方法。 netstat -ano | findstr 5554 &#xff0c;去查看pid是什么 得到pid&#xff0c;杀死这个pid taskkill /f /pid xxx

项目——电子词典(客户端、服务器交互,字典导入,单词查询)

一、项目要求 登录注册功能&#xff0c;不能重复登录&#xff0c;重复注册单词查询功能历史记录功能&#xff0c;存储单词&#xff0c;意思&#xff0c;以及查询时间基于TCP&#xff0c;支持多客户端连接采用数据库保存用户信息与历史记录将dict.txt的数据导入到数据库中保存。…

Kestrel和ISS服务器下的配置

一、Kestrel服务器 Kestrel是ASP.NET Core框架中的一个跨平台的Web服务器。它是ASP.NET Core应用程序默认的HTTP服务器&#xff0c;并且可作为独立的Web服务器来托管ASP.NET Core应用程序。 Kestrel具有以下特点和功能 1、跨平台 Kestrel是完全跨平台的&#xff0c;可以在Wind…

git压缩/合并多次commit提交为1次commit提交

git压缩/合并N次commit提交为1次commit提交 假设有最近3次提交&#xff1a; commit_id1 commit_id2 commit_id3目标是把以上3次commit合并成1个commit&#xff0c;注意&#xff0c;最新的commit提交在最上面。 在git bash里面的操作步骤&#xff1a; &#xff08;1&#xff0…

Mac 开发 Tang Nano FPGA 指南(使用终端和使用 VS Code 和插件,适用所有 Gowin FPGA)

最近收到了一个 Tang nano 9K FPGA开发板&#xff0c;就想借此机会研究一下。 官方文档里介绍如果想使用高云的 FPGA&#xff0c;就需要使用 GOWIN IDE&#xff0c;但是需要申请 license 提交一堆资料&#xff0c;我是别人送的就不太方便让别人弄。加上 IDE 其实并不是很适合学…

QT SSL handshake failed问题分析与解决 QT基础入门【网络编程】openssl

问题: 使用https方式进行post 和get请求时,有时候会出现SSL handshake failed的问题,其实是调用Qt QNetworkAccessManager出现的问题。 其实SSL握手是建立HTTPS连接过程的第一步。为了验证和建立连接,用户的浏览器和网站的服务器必须经过一系列检查(握手),从而建立HTTP…

C++ 网络编程项目fastDFS分布式文件系统(五)--nginx+fastdfs

目录 1. 文件上传下载流程 2. Nginx和fastDFS的整合 3. 数据库表 3.1 数据库操 3.2 数据库建表 1. 文件上传下载流程 fileID 需要是一个哈希来判定。 2. 文件下载流程 3. 优化 优化思路 : 直接让客户端连接 fastDFS 的存储节点 , 实现文件下载 举例 , 访问一个…