Patt&Patel-“Introduction to Computing Systems“(3)期末样卷题目解析:C语言与汇编语言转化

上接(1)basic ideas和与解析(1)

核心思路还是借具体题目来理解书中的两条basic ideas——abstraction of layers与think both softwarely and hardwarely。

C语言与汇编语言的转化

Patt&Patel-“Introduction to Computing Systems“(3)期末样卷题目解析:C语言与汇编语言转化_第1张图片

题目的要求是将下面的这段代码用LC-3改写。 这里相比起解析(1)写stack frame的难度又提高了一点,因为之前写stack frame我们只用知道local variable是如何存储的就可以了。

Patt&Patel-“Introduction to Computing Systems“(3)期末样卷题目解析:C语言与汇编语言转化_第2张图片

我们先分析这段C程序:首先是把新定义的dl_t的指针head作为参数传入到dl_length函数里,下一步是初始化count为0,然后就是进入循环,将head.next赋给elt,作为dl_t的指针,如果elt指针与head指针不相等,循环不结束,然后elt指针更新为elt.next,count的值加1。这样最终的count就就可以作为dl_length。

第一个很自然的问题就是为什么这段C程序能够算出cyclic,doubly-linked lists的长度,我的理解是,作为一个环,那么最后一个元素的next一定是指向最初的head,所以上述的循环可以算出这个环里有多少个元素。

第二个问题是要求我们的将上述的这段C语言转化为Assembly语言。其实有答案肯定可以看明白,但关键的问题是我们得独立想出来。思路就是拆分为几个步骤,逐步击破。具体来说在这段程序里有这么几步,第一步是初始化,第二步是运行循环,第三步是结束这段程序。

首先初始化,count=0与elt=head.next,一般来说用R0作为计数的register,然后根据题目条件我们知道M[R6]=head,需要专门用一个register来存head(因为后面有elt与head的比较),也需要专门用一个register来存elt,因此使用了R1和R2。

接着是循环,判断循环是否结束的办法是看head与elt是否相等,办法是通过相减来判断是否为0,所以就有了NOT R1,R1和ADD R1,R1,#1(取反加一),用R3作为判断的register。在循环里R0+1,然后下一个elt。

最后就是因为R6always on the top of stack,将R6-1上移一位,count->M[R6-1]。

待完善。

你可能感兴趣的:(大学课程,c语言,笔记)