assembly - 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
我正在尝试将一串字符或单词放入单行内存中。如果我一次添加一个字符,如何将字符添加到同一行内存以创建字符串。我可以一次将整个字符串添加到一行内存中吗?我只能找到将字符添加到内存中的参考资料,而不是字符串。
解决方案
标准 LC-3 是字可寻址的,而不是字节可寻址的。(有一个可字节寻址的 LC-3b,但这是一个完全不同的处理器。)
LC-3 的字长为 16 位,因此每个字可以支持 2 个 ascii 字节。这样做称为打包:当我们将两条或更多条信息放入同一个地址时。包装并不总是完成;有时每个地址存储一个字节(使用每个字的低位字节) - 因此您应该检查以确保需要将多个字节打包成一个字。
为了打包,你必须考虑(1)你有一个你想要的字节地址的概念,(2)从字节地址转换为字地址,(3)将感兴趣的字节放在上半部分或下半部分字地址的一部分。
如果您创建一个字节地址的概念,这通常可以完成,或者它可以使用子程序中的小型状态机来完成,例如。
前者的问题是寻址所有内存,因为一个字节地址比一个字地址多占用一位,所以你要么必须使用 2 个字作为地址,要么放弃一半的地址空间来表示一个字节地址。字(16 位)。但是,您可以创建一个子例程,将一个字节存储在上述任何字节地址。它必须读取字地址处的字,替换高字节或低字节(由偶数或奇数字节地址决定),然后将字存储回字地址。
对于后一种方法,我们可以为strcpy
and创建例程strcmp
:假设字符串的开头是字对齐的,这些例程将获取字地址,然后每个这样的例程将有两个部分(代码中编码的两个状态)。第一部分将与字地址的高字节一起工作,并复制或比较它,第二部分将与字地址的低字节一起工作,并复制或比较它。(或者先降低,然后再提高,即字节序的问题,大与小。)
(当然,如果我们总是将字符串打包成完整的单词(每个单词 2 个字节)并确保字符串始终从完整的单词边界开始,strcpy 或 strcmp 可以基于单词而不是逐字节复制或比较,结束复制/当低字节为空时进行比较。)
strcat
和其他一些字符串操作有点困难,因为我们需要独立地维护目标字符串和源字符串的上限和下限状态(而strcpy
和strcmp
- 给定开始单词对齐的字符串 - 上/下保持在锁定步骤中两个字符串)。
推荐阅读
- selenium - 如何从 selenium webdriver java 中的动态搜索框中选择一个值?
- javascript - 错误 [ERR_MODULE_NOT_FOUND]:找不到包 '.data'
- python - Kivy-ios:尝试构建 kivy 时工具链构建失败
- flutter - 颤振状态栏颜色不变
- python - 我如何在 python 中编写这个,最好是在 pandas 中?(假设我正在处理一个数据框)
- sql - 带有一些连接的分层查询
- python - 用于列组合的 Pandas 数据框模式验证
- android - 颤动从浮动操作按钮中删除背景颜色
- c++ - sfml - 不渲染纹理
- angular - 多重搜索Angular8错误'无法读取未定义的属性'值''