例如{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并应提供Output:max(x ,y)在R5中。另外,我还必须使用另一个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
答案 0 :(得分:0)
有一个基于网络的模拟器:https://wchargin.github.io/lc3web/ 使用此模拟器,您可以将数据手动输入到内存映射中,因此即使您无法在代码中填充内存空间,也可以在GUI中进行操作。
此外,代码文档在汇编中至关重要,因为它不能很好地进行自我文档编制。确保标签有意义,并且应该有一个块注释,指示寄存器使用情况“策略”(即哪些是临时的,哪些在更长的范围内使用,并且应在覆盖它们之前保存到堆栈中)。您还应该有一个块注释,指示每个逻辑块的意图,并且这些块可能会非常小,因为即使是简单的算术运算也可能是10到20行。
在第二行,“ LD R0,DATA”在标签上获取实际数据;根据您的描述,您想加载地址而不是数据,为此您使用“ LEA”而不是“ LD”。这将是您的LDR以后正常运行所必需的。
我不清楚您为什么将LENGTH初始化为0x5000,或者为什么DATA是.FILL,如果它打算是一个序列。要为更大(超过一个字)的数据阻塞内存,应使用.BLKW和字节数。这样可以保留空间,并且您可以根据需要手动将数据插入到模拟器中(点击式样式),或使用其他技术以编程方式写入数据。