【问题标题】:LC3 assembly: How to add string to row of memory, not characterLC3 程序集:如何将字符串添加到内存行,而不是字符
【发布时间】:2019-12-18 04:40:49
【问题描述】:
.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


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

【问题讨论】:

  • 内存的“行”是什么意思?内存本质上是一维数组,而不是具有行和列的二维数组。如果您指的是单个 8 位存储单元,那么显然这仅够容纳一个字符。如果你想要一个指针数组(例如char *argv[]),你可以将一个指向字符串的指针存储到内存中的一个单词中。如果您的意思是用一条指令将整个字符串复制到内存中的多个字节:不,这是汇编语言。 LC3 没有任何机器指令可以一次复制多个(或 2 个)字节。

标签: assembly lc3


【解决方案1】:

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

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

为了打包,您必须考虑 (1) 对所需的字节地址有概念,(2) 从字节地址转换为字地址,(3) 将感兴趣的字节放入上字地址的部分或下半部分。

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-11-29
    • 1970-01-01
    • 2017-03-09
    • 2023-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多