CSAPP Archlab

news/2025/11/30 22:58:26/文章来源:https://www.cnblogs.com/cqbzlzh/p/19290675

目录
  • Archlab
    • Part A Y86-64程序
    • Part B iaddq的实现
    • Part C 咕咕咕

Archlab

Part A Y86-64程序

规则:给定你一段C语言代码,需要使用\(Y86-64\)汇编代码写出与其函数上等价的代码

由于\(Y86-64\)功能有限,你需要将测试的输入也写在代码中

目录下使用 ./yas test.ys 编译 ./yis test.yo得到运行的结果

要求对于一个链表进行元素求和,其中C代码如下

/* $begin examples */
/* linked list element */
typedef struct ELE {long val;struct ELE *next;
} *list_ptr;/* 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;
}/* 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;}
}

比较简单,直接实现即可

#initialization.pos 0
irmovq stack, %rsp
call main
halt#sample linked list.align 8
ele1:.quad 0x00a.quad ele2
ele2:.quad 0x0b0.quad ele3
ele3:.quad 0xc00.quad 0#main functionmain:irmovq ele1, %rdicall sum_listret#sum_list functionsum_list:irmovq $0, %raxjmp testloop:mrmovq (%rdi), %rsiaddq %rsi, %raxmrmovq 8(%rdi), %rditest:andq %rdi, %rdijne loopret#set initial adress of %rsp.pos 0x200
stack:

最后需要多打一个换行才能过编译,我也不知道为什么(

#initialization.pos 0
irmovq stack, %rsp
call main
halt#sample linked list.align 8
ele1:.quad 0x00a.quad ele2
ele2:.quad 0x0b0.quad ele3
ele3:.quad 0xc00.quad 0#main function
main:irmovq ele1, %rdiirmovq $0, %raxcall rsum_listret#recursively calculate the sum of a listrsum_list:pushq %rbpandq %rdi, %rdije returnmrmovq (%rdi), %rbpaddq %rbp, %raxmrmovq 8(%rdi), %rdicall rsum_list
return:popq %rbpret#set initial adress of %rsp.pos 0x200
stack:

注意递归结束的时候,需要恢复被调用者保存寄存器的原始值

/* 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;
}
/* $end examples */
#initialization.pos 0
irmovq stack, %rsp
call main
halt#sample.align 8
# Source block
src:.quad 0x00a.quad 0x0b0.quad 0xc00
# Destination block
dest:.quad 0x111.quad 0x222.quad 0x333#main functionmain:irmovq src, %rdiirmovq dest, %rsiirmovq $3, %rdxirmovq $0, %raxirmovq $8, %rcxirmovq $1, %r8call copy_blockret#copy functioncopy_block:pushq %rbx
test:andq %rdx, %rdxje return
loop:mrmovq (%rdi), %rbxxorq %rbx, %raxrmmovq %rbx, (%rsi)addq %rcx, %rdiaddq %rcx, %rsisubq %r8, %rdxjmp test
return:popq %rbxret.pos 0x200
stack:

Part B iaddq的实现

给定你SEQ的实现,要求你补充iaddq指令(即将寄存器加上一个立即数)的实现

按照SEQ的步骤,一步一步判断每个相关信号的值就行

#/* $begin seq-all-hcl */
####################################################################
#  HCL Description of Control for Single Cycle Y86-64 Processor SEQ   #
#  Copyright (C) Randal E. Bryant, David R. O'Hallaron, 2010       #
###################################################################### Your task is to implement the iaddq instruction
## The file contains a declaration of the icodes
## for iaddq (IIADDQ)
## Your job is to add the rest of the logic to make it work####################################################################
#    C Include's.  Don't alter these                               #
####################################################################quote '#include <stdio.h>'
quote '#include "isa.h"'
quote '#include "sim.h"'
quote 'int sim_main(int argc, char *argv[]);'
quote 'word_t gen_pc(){return 0;}'
quote 'int main(int argc, char *argv[])'
quote '  {plusmode=0;return sim_main(argc,argv);}'####################################################################
#    Declarations.  Do not change/remove/delete any of these       #
######################################################################### Symbolic representation of Y86-64 Instruction Codes #############
wordsig INOP 	'I_NOP'
wordsig IHALT	'I_HALT'
wordsig IRRMOVQ	'I_RRMOVQ'
wordsig IIRMOVQ	'I_IRMOVQ'
wordsig IRMMOVQ	'I_RMMOVQ'
wordsig IMRMOVQ	'I_MRMOVQ'
wordsig IOPQ	'I_ALU'
wordsig IJXX	'I_JMP'
wordsig ICALL	'I_CALL'
wordsig IRET	'I_RET'
wordsig IPUSHQ	'I_PUSHQ'
wordsig IPOPQ	'I_POPQ'
# Instruction code for iaddq instruction
wordsig IIADDQ	'I_IADDQ'##### Symbolic represenations of Y86-64 function codes                  #####
wordsig FNONE    'F_NONE'        # Default function code##### Symbolic representation of Y86-64 Registers referenced explicitly #####
wordsig RRSP     'REG_RSP'    	# Stack Pointer
wordsig RNONE    'REG_NONE'   	# Special value indicating "no register"##### ALU Functions referenced explicitly                            #####
wordsig ALUADD	'A_ADD'		# ALU should add its arguments##### Possible instruction status values                             #####
wordsig SAOK	'STAT_AOK'	# Normal execution
wordsig SADR	'STAT_ADR'	# Invalid memory address
wordsig SINS	'STAT_INS'	# Invalid instruction
wordsig SHLT	'STAT_HLT'	# Halt instruction encountered##### Signals that can be referenced by control logic ######################### Fetch stage inputs		#####
wordsig pc 'pc'				# Program counter
##### Fetch stage computations		#####
wordsig imem_icode 'imem_icode'		# icode field from instruction memory
wordsig imem_ifun  'imem_ifun' 		# ifun field from instruction memory
wordsig icode	  'icode'		# Instruction control code
wordsig ifun	  'ifun'		# Instruction function
wordsig rA	  'ra'			# rA field from instruction
wordsig rB	  'rb'			# rB field from instruction
wordsig valC	  'valc'		# Constant from instruction
wordsig valP	  'valp'		# Address of following instruction
boolsig imem_error 'imem_error'		# Error signal from instruction memory
boolsig instr_valid 'instr_valid'	# Is fetched instruction valid?##### Decode stage computations		#####
wordsig valA	'vala'			# Value from register A port
wordsig valB	'valb'			# Value from register B port##### Execute stage computations	#####
wordsig valE	'vale'			# Value computed by ALU
boolsig Cnd	'cond'			# Branch test##### Memory stage computations		#####
wordsig valM	'valm'			# Value read from memory
boolsig dmem_error 'dmem_error'		# Error signal from data memory####################################################################
#    Control Signal Definitions.                                   #
#################################################################################### Fetch Stage     #################################### Determine instruction code
word icode = [imem_error: INOP;1: imem_icode;		# Default: get from instruction memory
];# Determine instruction function
word ifun = [imem_error: FNONE;1: imem_ifun;		# Default: get from instruction memory
];bool instr_valid = icode in { INOP, IHALT, IRRMOVQ, IIRMOVQ, IRMMOVQ, IMRMOVQ,IOPQ, IJXX, ICALL, IRET, IPUSHQ, IPOPQ, IIADDQ};# Does fetched instruction require a regid byte?
bool need_regids =icode in { IRRMOVQ, IOPQ, IPUSHQ, IPOPQ, IIRMOVQ, IRMMOVQ, IMRMOVQ , IIADDQ};# Does fetched instruction require a constant word?
bool need_valC =icode in { IIRMOVQ, IRMMOVQ, IMRMOVQ, IJXX, ICALL , IIADDQ};################ Decode Stage    ##################################### What register should be used as the A source?
word srcA = [icode in { IRRMOVQ, IRMMOVQ, IOPQ, IPUSHQ  } : rA;icode in { IPOPQ, IRET } : RRSP;1 : RNONE; # Don't need register
];## 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
];## What register should be used as the M destination?
word dstM = [icode in { IMRMOVQ, IPOPQ } : rA;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
];## Set the ALU function
word alufun = [icode == IOPQ : ifun;1 : ALUADD;
];## Should the condition codes be updated?
bool set_cc = icode in { IOPQ , IIADDQ};################ Memory Stage    ##################################### Set read control signal
bool mem_read = icode in { IMRMOVQ, IPOPQ, IRET };## Set write control signal
bool mem_write = icode in { IRMMOVQ, IPUSHQ, ICALL };## Select memory address
word mem_addr = [icode in { IRMMOVQ, IPUSHQ, ICALL, IMRMOVQ } : valE;icode in { IPOPQ, IRET } : valA;# Other instructions don't need address
];## Select memory input data
word mem_data = [# Value from registericode in { IRMMOVQ, IPUSHQ } : valA;# Return PCicode == ICALL : valP;# Default: Don't write anything
];## Determine instruction status
word Stat = [imem_error || dmem_error : SADR;!instr_valid: SINS;icode == IHALT : SHLT;1 : SAOK;
];################ Program Counter Update ############################## What address should instruction be fetched atword new_pc = [# Call.  Use instruction constanticode == ICALL : valC;# Taken branch.  Use instruction constanticode == IJXX && Cnd : valC;# Completion of RET instruction.  Use value from stackicode == IRET : valM;# Default: Use incremented PC1 : valP;
];
#/* $end seq-all-hcl */

Part C 咕咕咕

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

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

相关文章

效果-RG Trapcode红巨星(部分)

--本篇导航--3D StrokeEchospaceLuxShineStarglow3D Stroke 给路径或蒙版做勾边、 描边、流光,支持3D(需要打开合成摄像机)使用3D Stroke,需要有路径或者蒙版。对于文字、图片,需要创建文字的路径蒙版和图片边缘的…

鸿蒙超级终端体验:无缝流转的底层实现与用户体验优化 - 青青子衿-

引言:超级终端的技术愿景 在鸿蒙生态中,"超级终端"不仅是一个营销概念,更是通过分布式技术实现的革命性体验。想象一下这样的场景:你正在手机上观看视频,回到家后视频自动流转到智慧屏继续播放;或者在…

【AIOps?】基于DeepSeek逐步分析k8s集群故障记录(集群因特殊网络环境,禁用公网网卡eth1后全面崩溃) - 教程

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

鸿蒙分布式安全通信:跨设备身份认证与数据加密传输 - 青青子衿-

引言:分布式环境下的安全挑战 在鸿蒙分布式生态中,设备间的安全通信是构建可信协同体验的基石。想象一下这样的场景:手机与平板协同处理办公文档,智慧屏调用摄像头进行视频会议,车机系统同步手机导航数据——这些…

完整教程:为超过10亿条记录的订单表新增字段

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

Custom Lable整理ERROR

2025/11/30错误提示信息(ERROR 信息) 整理,再结合 自定义标签(Custom Label) ,做一个完整版本,部署到 Salesforce 开发 / 测试 / 生产环境中。👇 拆解关键概念:Custom Label:Salesforce 里的 “多语言文案容…

BipedalWalker实战:SAC算法如何让机器人学会稳定行走

下肢假肢的控制系统设计一直是个老大难问题。传统控制理论需要建立肢体和环境的精确数学模型,但现实世界可以不一样,比如说地面摩擦力时刻在变,坡度各不相同,患者随时可能绊一下。这就需要控制器具备自适应能力,能…

分布式硬件池化:跨设备摄像头、传感器能力协同 - 青青子衿-

引言:超级终端时代的硬件资源共享 在鸿蒙生态中,"超级终端"不仅是一个概念,更是通过分布式硬件池化技术实现的革命性体验。想象一下这样的场景:用手机的摄像头进行视频会议,同时调用平板的麦克风阵列获…

第十二周 感悟

首先,我会在文章的开头说一句:永远不要苛责以前发生过,做过任何事的自己 这一周,十分抱歉,并不是我所预想的一周,我只预料到和老友聚餐会给当天的晚上的身心放松,可能会影响到后面一天的状态。但未曾预料到个人…

【日记】傍晚半马训练途中,我似乎快要认不出自己生活的这座小城市了(1295 字)

正文下午备赛,从下午跑到傍晚,再跑到入夜。跑半程的途中遇到了很多个好看的小姐姐。气质截然不同,有的看起来俏皮可爱,有的看起来活泼,有的看起来就一副贵族气质……其中有一个印象很深,我现在都能记起来。都不能…

HarmonyOS内核机制:事件循环、消息队列与底层调度原理 - 青青子衿-

引言:为什么需要深入理解内核机制? 在鸿蒙应用开发中,我们经常遇到这样的场景:UI界面需要保持流畅响应,同时后台要进行大量数据处理;或者需要实现跨设备任务协同,保证多个设备间的任务有序执行。这些功能的实现…

读后感5

此前我常忽视错误处理,直到读《代码大全2》才意识到其重要性。书中“异常处理要精准且友好”的观点,让我重构了项目中的异常机制。比如将“未知错误”细化为“数据库连接失败”“参数格式错误”等具体类型,并返回清…

如何开始微信小程序渗透?

到底如何开始自己的微信小程序渗透?目录工具推荐反编译wxapkg动态调试WeChatOpenDevTools小程序所在目录如何逆向小程序的js加解密静态分析动态调试动静结合 工具推荐 反编译wxapkghttps://github.com/wux1an/wxapkg …

血腥之狼:APT组织利用合法软件NetSupport的攻击链分析

本文详细分析了APT组织Bloody Wolf的攻击活动,该组织通过鱼叉式网络钓鱼传播恶意JAR文件,利用合法的NetSupport远程管理工具进行攻击,主要针对中亚地区的政府机构和企业。血腥之狼:APT组织利用合法软件NetSupport的…

读后感4

《代码大全2》关于代码复用的论述,彻底改变了我“重复造轮子”的习惯。书中强调“提炼通用逻辑为工具类”,而非每次开发都从零编写。我将书中方法应用到数据校验功能中,把手机号、邮箱等校验逻辑封装成公共函数,后…

Python并发编程:concurrent.futures全解析

把"线程"和"进程"装进池子里,让Python并发像写同步代码一样简单0. 为什么选concurrent.futures?方案 易用性 自动复用 返回值 异常捕获threading 低(手动join) ❌ 手动 易漏multiprocessing 低(…

在 vscode 中部署juypter notebook 插件

在 vscode 中部署juypter notebook 插件2025-11-30 22:23 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block …

NOIP总结

day -inf 至 day -1 参加学校的模拟赛,考的只能说有好有坏。但是,基本上没有在考场上切紫题的能力(除了极少数的模板题或一些踩在我点上的贪心构造)大部分时间只能写出 \(T1\),一小部分时间能写出 \(T2\) ,\(T3,…

PostgreSQL性能调优:应对表膨胀、索引碎片和无效索引问题

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …