我正在尝试在LC3中制作2D数组。到目前为止,我正在考虑使用.BLKW初始化一块内存,然后将另一个数组加载到每个条目中。尽管如此,这似乎并不能引导我走上正轨。有什么建议吗?
答案 0 :(得分:0)
你绝对可以用.BLKW和.STRINGZ来做,虽然后者无疑是有点不寻常。
更大,通常的问题是你如何决定“获取”并“将”数据放入特定的内存区域。有几种方法可以做到这一点(没有正确答案)。
您最初的想法很酷且有效,但在我看来似乎更复杂,尤其是在LC3中。
更直接的“行主要”或“列主要”存储形式 - 其中连续的内存位置表示行中的下一个条目(行主要),或者列中的下一个条目(列主要)) - 是标准的方法。
基本上你想要分配那个内存区域,然后编写两个函数:一个用于将项目放在位置(r,c),并从位置(r,c)获取一个项目。
为此,您希望只需要放置一个小到足以适合LC3的16位存储器位置的项目。那可能是一个数字或一个角色。 (大于16位是可行的,但肯定会增加程序的复杂性。)
如果你想要一个完全粗糙的样本,你可以在这里找到:http://lc3tutor.org/#array2Dcolordersmp(或者只是去lc3tutor.org查看2D数组样本)。
如果您想学习并自己尝试,可以在那里阅读说明并忽略示例代码(如果您正在做作业而且想要确保学习它,那么最好)。否则,那里的代码应该在你在那里引用的基于浏览器的lc3模拟器中正常运行。
祝你好运!杰夫
PS这里是该代码的前导码,如果你想从中工作...希望这个例子有助于锚定完整代码示例中采用的col主要方法:
.ORIG x3000
BR MAIN;跳过下面的存储到主要部分的开头
.STRINGZ“ABCDEFGHIJKLMNOPQRSTUVWZYZ”;有点棘手 - 我们在2D数组中存储一系列字母以供参考。
上述字符串的地址为STARTS AT x3001,
您将看到的与下面的2D_ARRAY标签值相同。
这基本上是我们的2D_ARRAY,从x3001开始,占据了26个位置,
加1(对于字符串上的空终止符)。
我们假设2D数组有13行2列。
每行两个字母,每列13个字母。 26封信。
因此,我们的NUM_ROW标签为13,我们的NUM_COL标签为2.(请参阅下面的标签)
我们将此数组视为列主存储数组。
基于我们上面的字符串,这意味着第一个
的单元格列(我们的约定列#0)是:A-M。
并且第二列(列#1)的单元格是:N-Z。
如果我们以行主要形式存储数组,那么第一个ROW的单元格
将是A,B,第二个ROW将是C,D。等等。
像这样:
; R \ C | 0 | 1
------------
0 | A | Ñ
1 | B | 0
2 | C | P
3 | D | Q
4 | E | [R
5 | F |小号
6 | G | Ť
7 | H | û
8 |我| V
9 | J | w ^
10 | K | X
11 | L | ÿ
12 | M | ž
这样2D_ARRAY [ROW = 8,COL = 1]将是字母“V”