上接(1)basic ideas和与解析(1)
核心思路还是借具体题目来理解书中的两条basic ideas——abstraction of layers与think both softwarely and hardwarely。
C语言与汇编语言的转化
题目的要求是将下面的这段代码用LC-3改写。 这里相比起解析(1)写stack frame的难度又提高了一点,因为之前写stack frame我们只用知道local variable是如何存储的就可以了。
我们先分析这段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]。
待完善。