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

本文探讨了如何将C语言代码转换为LC-3汇编语言,涉及抽象层次理论,特别是如何通过初始化、循环结构和条件判断计算cyclicdoubly-linkedlist的长度。作者逐步解释了代码逻辑并展示了初始化、循环判断和最终存储计数的汇编步骤。
摘要由CSDN通过智能技术生成

上接(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]。

待完善。

  • 10
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值