csapp archlab PartC满分解答

这篇具有很好参考价值的文章主要介绍了csapp archlab PartC满分解答。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

任务

修改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进行判断是综合考虑统计因素和余数优先级的结果

csapp archlab PartC满分解答,CSAPP,csapp

代码

##################################################################
# 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         # Compare with 3 (len + 10 - 3)
        jl      L0R2            # len < 3
        jg      L4R9            # len > 3
        je      Rem3            # len == 3
L0R2:
        iaddq   $2,%rdx         # Compare with 1 (len + 3 - 1)
        je      Rem1            # len == 1
        jg      Rem2            # len == 2
        ret                     # len == 0
L4R6:
        iaddq   $2,%rdx         # Compare with 5 (len + 7 - 5)
        jl      Rem4            # len == 4
        je      Rem5            # len == 5
        jg      Rem6            # len == 6
L4R9:
        iaddq   $-4,%rdx        # Compare with 7 (len + 3 - 7)
        jl      L4R6            # len < 7
        je      Rem7            # len == 7
L8R9:
        iaddq   $-1,%rdx        # Compare with 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 */

实验成绩

csapp archlab PartC满分解答,CSAPP,csappcsapp archlab PartC满分解答,CSAPP,csapp文章来源地址https://www.toymoban.com/news/detail-660955.html

到了这里,关于csapp archlab PartC满分解答的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • CSAPP实验buflab(bufbomb)

    本实验的目的在于加深对 IA-32 过程调用规则和栈结构的具体理解。实验的主要内容是对一个可执行程序“bufbomb”实施一系列缓冲区溢出攻击(buffer overflow attacks),也就是设法通过造成缓冲区溢出来改变该程序的运行内存映像(例如将专门设计的字节序列插入到栈中特定内存

    2024年02月03日
    浏览(29)
  • 程序人生(CSAPP大作业)

    摘  要 本文介绍了 Hello 程序的生命周期。本文通过对Hello在Linux下的预处理、编译、汇编、链接等进程的分析,详细讲解了一个程序从诞生到执行再到消亡的典型过程。虽然程序执行的过程在程序员眼中只是屏幕上显示的一根字符串,但在短短的几毫秒内,程序经历了预处理

    2023年04月24日
    浏览(39)
  • 【CSAPP 3.5】算术和逻辑操作

    下表列出了 x86-64 的一些整数和逻辑操作。大多数操作都分成了指令类,这些指令类有各自带不同大小操作数的变种(除了 leaq )。例如,指令 ADD 由 4 条加法指令组成: addb 、 addw 、 addl 、 addq ,分别是字节加法、字加法、双字加法、四字加法。以下操作被分为 4 组: 加载

    2024年02月03日
    浏览(28)
  • CSAPP Shell Lab 实验报告

    前言:强烈建议先看完csapp第八章再做此实验,完整的tsh.c代码贴在文章末尾了 进程的概念、状态以及控制进程的几个函数(fork,waitpid,execve)。 信号的概念,会编写正确安全的信号处理程序。 shell的概念,理解shell程序是如何利用进程管理和信号去执行一个命令行语句。 sh

    2024年02月04日
    浏览(33)
  • CSAPP Lab4- PerfLab

    图像用一维数组表示,第(i,j)个像素表示为I[RIDX(i,j,n)],n为图像的维数 目标:使用代码优化技术使旋转操作运行的更快 目标:使用代码优化技术使平滑操作运行的更快 CPE or Cycles per Element 如果一个函数使用C个周期去执行一个大小为N*N的图像,那么CPE=C/(N*N),因此CPE越小越好

    2024年02月06日
    浏览(28)
  • csapp实验5-cachelab实验详解

    1 简要分析 实验目的:熟悉cache,学会根据cache优化程序执行速度 工作空间:csim.c和trans.c 实验内容: part A:在csim.c下面编写一个缓存模拟器来模拟cache的行为,并且规定该模拟器用LRU替换策略,即替换某组中最后一次访问时间最久远的一块,还要支持一些输入可选参数 操作

    2024年02月04日
    浏览(26)
  • CSAPP - bomblab phase_2 分析

    概要 bomblab phase_2 的答案,网络上相关的文章、视频有不少了。不过反汇编这件事情,只看别人答案还是没法覆盖一个汇编小白的技术盲点的,真实的反汇编过程也往往不是想答案那样,一次性顺畅得到结果的。 对于 phase_2, 我尝试翻译 phase_2 的汇编代码到 C 代码, 第一次失

    2024年01月18日
    浏览(34)
  • 哈工大CSAPP程序人生大作业

    正在上传…重新上传取消 计算机系统 大作业 题     目   程序人生 -Hello’s P2P  专       业    计算机科学与技术        学    号   2021110991             班    级      2103101             学       生         安心           指 导 教 师    

    2023年04月24日
    浏览(54)
  • CSAPP - 反编译 string_length

    虽然先前已经把 phase_1 和 phase_2 做出来了, 但其实是参考了网络上的答案, 仅仅是大概知道了关键汇编代码。但其实并没有真的懂。为啥呢?因为很多模棱两可的地方是靠猜测的,而猜测是脆弱的。 重新看 phase_1, 第一个门槛是 string_length 函数。尝试逐句翻译回 C 代码。

    2024年02月01日
    浏览(39)
  • HNU-计算机系统-CSAPP作业答案

    计科210X wolf 202108010XXX 第2章 2.61 解: (!~x) || (!x) || (!~(x|0x00ffffff)) || (!(x0x000000ff)) 或者: (!~x) || (!x) || (!~(x24)) || (!(x24)) 2.71 A. 实现的是逻辑位移,扩展后前面全是0,不符合符号扩展的要求 B. 2.87 格式A 格式B 位 值 位 值 1 01110 001 -9/16 1 0110 0010 -9/16 0 10110 101 208 0 1110 1010 208 1 00111

    2024年02月08日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包