首页 > 解决方案 > LC3 程序集:如何将字符串添加到内存行,而不是字符

问题描述

.ORIG x3000
LEA R0, SENTENCE_PTR ; start at memory address x4000 (sentence)
LDR R1, R0, #0 ; ASCII at x4000 ;                    (ASCII)
LEA R2, WORDS  ; start at beginning of memory block

STR R1, R2 ; store ASCII in memory
ADD R2, R2, #1 ; increment memory pointer


HALT

SENTENCE_PTR    .FILL x4000 ; beggining of sentence
WORDS .BLKW #198 ; pointers to words and counters
.END


我正在尝试将一串字符或单词放入单行内存中。如果我一次添加一个字符,如何将字符添加到同一行内存以创建字符串。我可以一次将整个字符串添加到一行内存中吗?我只能找到将字符添加到内存中的参考资料,而不是字符串。

标签: assemblylc3

解决方案


标准 LC-3 是字可寻址的,而不是字节可寻址的。(有一个可字节寻址的 LC-3b,但这是一个完全不同的处理器。)

LC-3 的字长为 16 位,因此每个字可以支持 2 个 ascii 字节。这样做称为打包:当我们将两条或更多条信息放入同一个地址时。包装并不总是完成;有时每个地址存储一个字节(使用每个字的低位字节) - 因此您应该检查以确保需要将多个字节打包成一个字。

为了打包,你必须考虑(1)你有一个你想要的字节地址的概念,(2)从字节地址转换为字地址,(3)将感兴趣的字节放在上半部分或下半部分字地址的一部分。

如果您创建一个字节地址的概念,这通常可以完成,或者它可以使用子程序中的小型状态机来完成,例如。

前者的问题是寻址所有内存,因为一个字节地址比一个字地址多占用一位,所以你要么必须使用 2 个字作为地址,要么放弃一半的地址空间来表示一个字节地址。字(16 位)。但是,您可以创建一个子例程,将一个字节存储在上述任何字节地址。它必须读取字地址处的字,替换高字节或低字节(由偶数或奇数字节地址决定),然后将字存储回字地址。

对于后一种方法,我们可以为strcpyand创建例程strcmp:假设字符串的开头是字对齐的,这些例程将获取字地址,然后每个这样的例程将有两个部分(代码中编码的两个状态)。第一部分将与字地址的高字节一起工作,并复制或比较它,第二部分将与字地址的低字节一起工作,并复制或比较它。(或者先降低,然后再提高,即字节序的问题,大与小。)

(当然,如果我们总是将字符串打包成完整的单词(每个单词 2 个字节)并确保字符串始终从完整的单词边界开始,strcpy 或 strcmp 可以基于单词而不是逐字节复制或比较,结束复制/当低字节为空时进行比较。)

strcat和其他一些字符串操作有点困难,因为我们需要独立地维护目标字符串和源字符串的上限和下限状态(而strcpystrcmp- 给定开始单词对齐的字符串 - 上/下保持在锁定步骤中两个字符串)。


推荐阅读