【问题标题】:Initializing an array in Hack Assembly Code在 Hack 汇编代码中初始化一个数组
【发布时间】:2023-03-15 04:40:01
【问题描述】:

声明初始化数据的语法是什么,如:

  • 在 hack 汇编语言中初始化一个全局数组?

例如。 int [] arr = {1, 2, 3, 4, 5}

  • 初始化字符串文字?

“你好世界\n”

【问题讨论】:

  • 好问题。我四处搜索,找不到任何示例代码,例如“hello world”,如果找到,它可能会告诉我们字符串(“hello world”)是如何在它们的汇编语言中存储和声明的。我见过的所有汇编语言示例都是机器代码,而不是初始化数据。当然,我们可以声明存储到数据内存中的代码,但这似乎是创建初始化字符串和数组的一种非常尴尬的方式。
  • 据我所知,jack 编译器生成代码以动态构造字符串文字,分配堆空间,然后通过一次附加一个字符来构建它们。因此,单个字符值存储在单个机器代码指令中,并使用string.newstring.append 等函数调用在堆中重新组装成字符串。这表明可能无法将 RAM 的初始状态与程序一起加载(在 ROM 中)。
  • 你可以用同样的方式构建一个初始值的整数数组,通过使用编码在代码序列中的常量写入每个单独的数组元素的初始值,然后是适当的存储指令,也许可以通过硬编码地址来简化RAM 中的数组,而不是使用堆分配。
  • 最后,您可以使用脚本将值预加载到 RAM 中,但这不是汇编语言的一部分,而是测试系统的一部分,允许不同的脚本建立初始条件并检查最终条件.

标签: assembly nand2tetris


【解决方案1】:

Hack 汇编语言无法直接执行此操作,因为它只汇编程序指令,并且程序存储器是只读的,Hack 机器指令不能读取,除了加载常量操作的退化情况。

因此,您要做的是编写代码来初始化您的 ram,使用一系列加载常量/存储操作。这有点棘手,因为您只能加载 15 位常量。

当我遇到这个问题时,我编写了一个 python 脚本来生成我需要的汇编代码。这是一个 python 代码 sn-p,它生成代码以将任意值“word”存储到内存位置“base”中,这可能对您有帮助。

if word >= 32768:
    if word == 65535:
        print "\t@" + "{:05}".format(base) + "\t\t// " + str(word)
        print "\tM = -1"
    else:
        print "\tD = -1\t\t// " + str(word)
        print "\t@" + "{:05}".format(65535-word)
        print "\tD = D - A"
        print "\t@" + "{:05}".format(base)
        print "\tM = D"
else:
    if word == 0:
        print "\t@" + "{:05}".format(base) + "\t\t// " + str(word)
        print "\tM = 0"
    else:
        print "\t@" + "{:05}".format(word) + "\t\t// " + str(word)
        print "\tD = A"
        print "\t@" + "{:05}".format(base)
        print "\tM = D"

base += 1

【讨论】:

    猜你喜欢
    • 2011-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多