前言
archlab是CSAPP3e第4章处理器体系结构
对应的实验,该实验主要目的是学习Y86-64指令集体系结构,HCL控制语言以及Y86-64的流水线实现。因此,对应的实验也分为3个部分一一与之对应,现在暂时仅完成该实验的Part A
部分。因为课程主页上的项目不断更新,很难维持博文的内容与课程主页上的实验内容保持一致,所以将本文章对应的程序源码保存在个人项目中archlab,。
Part A
该部分内容比较简单,就是使用Y86-64指令集体系实现example.c
文件中对应的3个函数,然后使用yas
编译器编译对应的汇编文件,最后使用yis
模拟器模拟程序的运行过程。如有其它的疑问,可以参见项目文件中的archlab.pdf
。
循环求链表和函数
example.c
文件中第一个函数的功能就是求链表所有元素的和,数据段在内容在archlab.pdf
文件中指出。参照CSAPP的4.1.5
节求数组元素的和,很容易实现对应的求链表元素的和的汇编程序。
1 | # Execution begins 0 address |
在shell中执行如下命令,验证汇编代码的正确性。我们看到
%rax
寄存器的内容为cba
,等于链表所有元素的和。
1 | root@misc$ ./yas sum.ys |
递归求链表元素的和
函数2和函数1实现相同的功能,不过函数2使用递归形式,因此程序的调用和栈与函数1基本保持一致,仅函数2本身的具体实现发生变化。对应的汇编程序如下:
1 | # Execution begins 0 address |
同样的,我们看到
%rax
寄存器的内容为cba
,等于链表所有元素的和。
1 | root@misc$ ./yas rsum.ys |
数组复制
第3个函数将数组元素从一个数组复制到另一个数组中,并且返回数据元素的检验值。功能比较简单,与链表的对应的操作差异不大,唯一需要注意的就是Y86-64指令集体系没有从寄存器与立即数算术运算的指令,因此首先需要将立即数复制到寄存器中再执行相应的算术运算。对应的汇编代码如下:
1 | # Execution begins at address 0 |
同样的,我们看到
%rax
寄存器的内容为cba
,等于数组元素异或的值。
1 | root@misc$ ./yis copy.yo |