手头的任务是编写一个子程序 STRCPY 来实现一个字符串复制功能,就像 C 编程语言的strcpy()
功能一样。
我知道:
R1 是要复制的字符串的地址
R2 是字符串要复制到的地址
假设该函数应该将源字符串的每个字符复制到目标地址(包括空终止符),从而创建源字符串的完整副本。此外,可以假设调用者已经为新字符串分配了足够的空间,并且子程序不会向调用者返回任何信息。
这里给出了起始代码。
我想我一开始对所有 LEA 命令有点不知所措,因此,任何指导/帮助都将不胜感激。
手头的任务是编写一个子程序 STRCPY 来实现一个字符串复制功能,就像 C 编程语言的strcpy()
功能一样。
我知道:
R1 是要复制的字符串的地址
R2 是字符串要复制到的地址
假设该函数应该将源字符串的每个字符复制到目标地址(包括空终止符),从而创建源字符串的完整副本。此外,可以假设调用者已经为新字符串分配了足够的空间,并且子程序不会向调用者返回任何信息。
这里给出了起始代码。
我想我一开始对所有 LEA 命令有点不知所措,因此,任何指导/帮助都将不胜感激。
我没有你的起始代码,但猜测需要什么......
您可以先用英文提供更详细的解释。
例如:
你有一个字符串要复制。字符串在内存中,从固定地址开始。固定地址在 R1 中。您要将字符串复制到内存中,复制到另一个固定地址。另一个固定地址在 R2 中。
您可以通过复制一个字符、移动到下一个字符并重复来解决此问题。当您击中最后一个字符(值为 0 的字符)时,您将停止。
然后把它变成汇编:
将这个英文配方翻译成 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 模拟器。
祝你好运。