我的 LC3 解决方案对于查找递增序列的长度是否正确?
Is my LC3 solution correct for finding the length of an increasing sequence?
我被要求在 LC3 中创建一个程序来识别数字序列中递增子序列的最大长度。
例如。 {1,2,3,5,2,2,4,5,6,8,3,4}
解法:最大递增子序列:{2,2,4,5,6,8},递增子序列的最大长度:6
为了做到这一点,我被要求创建一个名为 MAX_LEN 的子例程,它计算两个数字 x,y 的 max(x,y) 并在 R2,R5 中输入 x,y 并且应该给出输出:R5 中的 max(x,y)。我还必须使用另一个 INC_SUB_LEN 来计算给定地址的第一个递增子序列的长度。输入地址为 R0,输出长度应在 R2 中。迄今为止 R5 中的最大长度。我还应该使用 MAX_LEN 子例程。我们将从中找到子序列的大序列存储在地址 DATA 中,其长度存储在地址 LENGTH 中。我还在 LENGTH .FILL x5000 和 DATA .FILL x5001.
末尾给出了命令
我是 LC3 编程的新手,所以我在纸上写了我的程序。有人可以在我的解决方案中发现任何错误吗?如果是,我该如何纠正它们?
我的解决方案:
.ORIG x3000
LD R0,DATA
LD R1,DATA
LOOP1 JSR INC_SUB_LEN
ADD R1,R1,#1
LD R4,LENGTH
NOT R4,R4
ADD R4,R4,#1
ADD R3,R1,R4
BRn LOOP1
INC_SUB_LEN
LOOP ADD R2,R2,#1
ADD R4,R0,#0
LDR R6,R0,#1
LDR R0,R0,#1
NOT R6,R6
ADD R6,R6,#1
ADD R7,R4,R6
BRnz LOOP
JSR MAX_LEN
RET
MAX_LEN
NOT R5, R5
ADD R5, R5, #1
ADD R3,R2,R5
BRnz ELSE
ADD R5,R2,#0
NOT R5,R5
ADD R5,R5,#1
ELSE NOT R5,R5
ADD R5,R5,#1
RET
LENGTH .FILL x5000
DATA .FILL x5001
.END
有一个基于网络的模拟器:https://wchargin.github.io/lc3web/
使用此模拟器,您可以手动将数据输入到内存映射中,因此即使您无法在代码中填写内存 space 您也可以在 GUI 中完成。
此外,代码文档在汇编中非常重要,因为它不适合自我文档化。确保标签是有意义的,你应该有一个块注释来指示寄存器使用 "strategy"(即哪些是临时的,哪些在更长的范围内使用,并且应该在覆盖它们之前保存到堆栈中)。您还应该有一个块注释,指示每个逻辑块的意图,并且这些块可能非常小,因为即使是简单的算术也可能是 10-20 行。
第二行,"LD R0, DATA"取标签处的实际数据;根据您的描述,您想要加载地址而不是数据,为此您使用 "LEA" 而不是 "LD"。这将是您的 LDR 稍后正常运行所必需的。
我不清楚为什么将 LENGTH 初始化为 0x5000,或者为什么 DATA 是 .FILL(如果它是一个序列)。要为更大(超过一个字)的数据阻塞内存,您应该使用 .BLKW 和字节数。这会保留 space,您可以根据需要手动将数据插入模拟器(点击式),或者使用其他技术以编程方式写入数据。
我被要求在 LC3 中创建一个程序来识别数字序列中递增子序列的最大长度。
例如。 {1,2,3,5,2,2,4,5,6,8,3,4}
解法:最大递增子序列:{2,2,4,5,6,8},递增子序列的最大长度:6
为了做到这一点,我被要求创建一个名为 MAX_LEN 的子例程,它计算两个数字 x,y 的 max(x,y) 并在 R2,R5 中输入 x,y 并且应该给出输出:R5 中的 max(x,y)。我还必须使用另一个 INC_SUB_LEN 来计算给定地址的第一个递增子序列的长度。输入地址为 R0,输出长度应在 R2 中。迄今为止 R5 中的最大长度。我还应该使用 MAX_LEN 子例程。我们将从中找到子序列的大序列存储在地址 DATA 中,其长度存储在地址 LENGTH 中。我还在 LENGTH .FILL x5000 和 DATA .FILL x5001.
末尾给出了命令我是 LC3 编程的新手,所以我在纸上写了我的程序。有人可以在我的解决方案中发现任何错误吗?如果是,我该如何纠正它们?
我的解决方案:
.ORIG x3000
LD R0,DATA
LD R1,DATA
LOOP1 JSR INC_SUB_LEN
ADD R1,R1,#1
LD R4,LENGTH
NOT R4,R4
ADD R4,R4,#1
ADD R3,R1,R4
BRn LOOP1
INC_SUB_LEN
LOOP ADD R2,R2,#1
ADD R4,R0,#0
LDR R6,R0,#1
LDR R0,R0,#1
NOT R6,R6
ADD R6,R6,#1
ADD R7,R4,R6
BRnz LOOP
JSR MAX_LEN
RET
MAX_LEN
NOT R5, R5
ADD R5, R5, #1
ADD R3,R2,R5
BRnz ELSE
ADD R5,R2,#0
NOT R5,R5
ADD R5,R5,#1
ELSE NOT R5,R5
ADD R5,R5,#1
RET
LENGTH .FILL x5000
DATA .FILL x5001
.END
有一个基于网络的模拟器:https://wchargin.github.io/lc3web/ 使用此模拟器,您可以手动将数据输入到内存映射中,因此即使您无法在代码中填写内存 space 您也可以在 GUI 中完成。
此外,代码文档在汇编中非常重要,因为它不适合自我文档化。确保标签是有意义的,你应该有一个块注释来指示寄存器使用 "strategy"(即哪些是临时的,哪些在更长的范围内使用,并且应该在覆盖它们之前保存到堆栈中)。您还应该有一个块注释,指示每个逻辑块的意图,并且这些块可能非常小,因为即使是简单的算术也可能是 10-20 行。
第二行,"LD R0, DATA"取标签处的实际数据;根据您的描述,您想要加载地址而不是数据,为此您使用 "LEA" 而不是 "LD"。这将是您的 LDR 稍后正常运行所必需的。
我不清楚为什么将 LENGTH 初始化为 0x5000,或者为什么 DATA 是 .FILL(如果它是一个序列)。要为更大(超过一个字)的数据阻塞内存,您应该使用 .BLKW 和字节数。这会保留 space,您可以根据需要手动将数据插入模拟器(点击式),或者使用其他技术以编程方式写入数据。