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

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

待完善。

相关推荐

  1. C语言期末题目+笔记

    2024-01-16 10:46:04       30 阅读
  2. 1+X运维试题C(初级)

    2024-01-16 10:46:04       33 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-01-16 10:46:04       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-01-16 10:46:04       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-01-16 10:46:04       19 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-01-16 10:46:04       20 阅读

热门阅读

  1. T527Android13关机时黑屏无提示问题

    2024-01-16 10:46:04       35 阅读
  2. Android 13 关闭相册的编辑功能

    2024-01-16 10:46:04       32 阅读
  3. 一个SqlSugar实际案例

    2024-01-16 10:46:04       32 阅读
  4. 设置 SSH 通过密钥登录

    2024-01-16 10:46:04       35 阅读
  5. 使用Three.js创建令人惊叹的WebGL 3D可视化

    2024-01-16 10:46:04       33 阅读