【问题标题】:How to start the basic programming task using Pennsim and LC-3 programming language?如何使用 Pennsim 和 LC-3 编程语言开始基本的编程任务?
【发布时间】:2014-11-27 02:55:00
【问题描述】:

手头的任务是编写一个子例程 STRCPY 来实现一个字符串复制功能,如 C 编程语言的 strcpy() 函数。

我知道:

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

R2 是要复制字符串的地址

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

起始码为here

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

【问题讨论】:

  • 课程资料的链接可能会有所帮助,但它需要登录并且您忘记发布您的帐户凭据。

标签: c memory-address cpu-registers strcpy lc3


【解决方案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)。

如果 R3 为 0(空字符)(R4 = R3 & 0x1111),AND R4, R3, x1111 会将 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 模拟器。

祝你好运。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-18
    • 1970-01-01
    • 2014-11-07
    • 1970-01-01
    相关资源
    最近更新 更多