-2

手头的任务是编写一个子程序 STRCPY 来实现一个字符串复制功能,就像 C 编程语言的strcpy()功能一样。

我知道:

R1 是要复制的字符串的地址

R2 是字符串要复制到的地址

假设该函数应该将源字符串的每个字符复制到目标地址(包括空终止符),从而创建源字符串的完整副本。此外,可以假设调用者已经为新字符串分配了足够的空间,并且子程序不会向调用者返回任何信息。

这里给出了起始代码。

我想我一开始对所有 LEA 命令有点不知所措,因此,任何指导/帮助都将不胜感激。

4

1 回答 1

1

我没有你的起始代码,但猜测需要什么......

您可以先用英文提供更详细的解释。

例如:

你有一个字符串要复制。字符串在内存中,从固定地址开始。固定地址在 R1 中。您要将字符串复制到内存中,复制到另一个固定地址。另一个固定地址在 R2 中。

您可以通过复制一个字符、移动到下一个字符并重复来解决此问题。当您击中最后一个字符(值为 0 的字符)时,您将停止。

  1. 将R1中地址的字符复制到R2中的地址
  2. 检查复制的字符是否为空终止符
  3. 如果是,请停止。
  4. 如果不是,则将 R1 和 R2 中的地址上移一个字符(指向下一个字符),然后转到步骤(1)。

然后把它变成汇编:

将这个英文配方翻译成 LC3 程序集的一些指令可能是:

LDR R3, R1, #0将 R1 中地址处的字符加载到 R3 中。

STR是可用于将字符存储在 R2 中的类似命令(但如果这是家庭作业,您应该自己解决)。

ADD R1, R1, #1将对寄存器 R1 中的地址加 1 (R1 = R1 + 1)。

AND R4, R3, x1111如果 R3 为 0(空字符)(R4 = R3 & 0x1111),则将 R4 设置为 0。

BRZ DONE如果最后一条指令设置为零标志,将转到标签“DONE:”。

LEA R5, NEXT接下来将通过JMP R5将标签“NEXT:”的地址加载到 R5 中,然后跳转到该值来转到标签“NEXT:”。

我想你的代码看起来像:

LEA R5, NEXT                Put the address of NEXT in R5
NEXT:                       
    LDR R3, R1, #0          Copy what is in the address in R1 (a character) to R3
    STR...                  Store the character in R2
    AND R4, R3, x1111       See if the character in R3 (the one copied) is 0
    BRZ DONE                If it is, finish
    ADD R1, R1, #1          If not, go to the next character
    ADD ...
    JMP R5                  Jump to the address in R5 (which is NEXT)
DONE:
    ...

你不应该假设我有这个正确的。我手边没有 LC3 模拟器。

祝你好运。

于 2014-11-27T09:53:52.167 回答