【发布时间】:2021-06-18 10:46:54
【问题描述】:
我了解了 LC-3 的工作原理,但我终其一生都无法弄清楚如何在 LC-3 汇编中编写代码。我的目标是能够编写简单的程序,例如生成斐波那契数或对数组进行排序。
有人可以指点我学习这个的资源吗?我精通 Python 和 Java,所以这些问题背后的基本逻辑对我来说很清楚。
【问题讨论】:
-
从组装的角度思考就像把积木放在一起来建造更大的东西。像乐高或其他东西:简单的积木。对于任何给定的伪代码步骤,将其分解为机器可以执行的操作,在一系列步骤中使用有限的机器状态(寄存器)来计算一些有用的东西。对于数组,考虑指针(如 C)是有用的。
-
我从未使用过 LC-3 组件,但也许 this instruction list 可以帮助您。有时当我在编写一个可能需要使用循环之类的可能很长的过程时,我喜欢用更高级的语言编写它,然后慢慢地使函数更像“汇编”(扩展像
a+b*c/whatever这样的大型操作,用do while循环替换 for/while 循环,甚至goto如果我在循环方面遇到很多麻烦)。也许不是最好的方法,但正如 Peter Cordes 所说,简单的构建块。 -
@mediocrevegetable1:在高级语言中获得正确的逻辑是一种非常好的方法,被广泛推荐。是的,为了有帮助,你必须根据 asm 实际可以做的事情来编写它,比如不是 Python 列表理解。 (C 对此有好处;它只能做无需循环即可轻松编译为 asm 的事情)。是的,无论您是尝试让编译器生成您想要的 asm,还是计划手写 asm,以类似 asm 的方式编写高级代码都很好。
-
这些都不是 LC-3 特有的;它是一个寄存器机器,不需要你跳过疯狂的圈子(比如像一些玩具 ISA 那样用于数组索引的自修改代码,例如 LMC,或者像 MARIE 这样的累加器机器,使用多个数字是一件很痛苦的事情,不断存储/重新加载)。 LC-3 非常简单,缺少右移等关键功能,但如果您的算法不需要它,它与 MIPS 或 x86 等主流 ISA 并没有太大区别。
-
@PeterCordes 是的,我通常为此使用 C,也许 Java 将是 Java 和 Python 中 OP 的最佳选择。我自己也检查了指令列表(found a more comprehensive list and a guide),它确实非常简单和准系统(比如只有 ADD,AND 而不是 ALU)。我从未深入研究过微控制器组装,但这似乎是学习一些基础知识的好方法。