LMC 中的数组编程
Programming arrays in LMC
我正在应对这个挑战:
The program needs to accept a sequence of integers. It ends with number 999. The integers (except 999) are placed in a list.
The integers must be less than or equal to 99. Any inputs greater than 99 are not placed in the list.
If the input would have more than ten numbers, only the first ten are stored.
999 is not part of the output.
我不知道如何将列表长度限制为十 (10) 个数字。也不知道怎么倒序输出列表。
这是我的代码:
start INP
STA temp
SUB big
BRZ doout
LDA temp
SUB hundred
BRP start
sub one
STA N
xx STA ARR
LDA xx
add one
sta xx
BRA start
doout HLT
temp dat 0
big dat 999
hundred dat 100
ARR dat
one dat 1
N dat 10
你程序中的 xx
表明你没有接受
的提示
它解释了如何使用自修改代码遍历数组——存储值或加载值。
在您的尝试中,没有涉及输出的部分。
对于程序的开始部分,我实际上建议先减去 100,然后再减去 899(等于 999)。这样你就可以将(减少的)输入保留在累加器中而不必恢复它。
此外,由于 LMC 规范中的歧义,在 SUB
之后立即执行 BRZ
并不完全“安全”(这是因为累加器的内容是undefined/unspecified当有下溢时,理论上可以为0)。在分支代码中执行 BRZ
之前,您应该始终先执行 BRP
。但是,由于输入不能大于 999,BRP
足以检测相等性。
对于自修改部分,您可以在数组数据部分设置结束标记,并定义 LDA
和 STA
指令,这些指令将 read/store 处的值数组的 end。只要您的代码有准确的指令,您就知道您已经到达终点。
这是它的工作原理:
LDA store # Initialise dynamic store instruction
STA dyna1
loop INP
dyna1 STA array
SUB toobig
BRP skip
LDA dyna1
ADD one
STA dyna1
SUB staend
BRP print
BRA loop
skip SUB trailer
BRP print # Safer to do BRP than BRZ
BRA loop # Input was less than 999
print LDA dyna1 # Convert dynamic store instruction
SUB store # ... to index
ADD load # ... to load instruction
STA dyna2
loop2 LDA dyna2
SUB one
STA dyna2
SUB load
BRP dyna2
end HLT # all done
dyna2 LDA array
OUT
BRA loop2
store STA array
load LDA array
staend STA after
one DAT 1
toobig DAT 100
trailer DAT 899
array DAT
DAT
DAT
DAT
DAT
DAT
DAT
DAT
DAT
DAT
after DAT
<script src="https://cdn.jsdelivr.net/gh/trincot/lmc@v0.816/lmc.js"></script>
如您所见(运行 此处的脚本),dyna1
和 dyna2
处的指令在它们所在的循环执行期间被修改。
我正在应对这个挑战:
The program needs to accept a sequence of integers. It ends with number 999. The integers (except 999) are placed in a list. The integers must be less than or equal to 99. Any inputs greater than 99 are not placed in the list.
If the input would have more than ten numbers, only the first ten are stored.
999 is not part of the output.
我不知道如何将列表长度限制为十 (10) 个数字。也不知道怎么倒序输出列表。
这是我的代码:
start INP
STA temp
SUB big
BRZ doout
LDA temp
SUB hundred
BRP start
sub one
STA N
xx STA ARR
LDA xx
add one
sta xx
BRA start
doout HLT
temp dat 0
big dat 999
hundred dat 100
ARR dat
one dat 1
N dat 10
你程序中的 xx
表明你没有接受
它解释了如何使用自修改代码遍历数组——存储值或加载值。
在您的尝试中,没有涉及输出的部分。
对于程序的开始部分,我实际上建议先减去 100,然后再减去 899(等于 999)。这样你就可以将(减少的)输入保留在累加器中而不必恢复它。
此外,由于 LMC 规范中的歧义,在 SUB
之后立即执行 BRZ
并不完全“安全”(这是因为累加器的内容是undefined/unspecified当有下溢时,理论上可以为0)。在分支代码中执行 BRZ
之前,您应该始终先执行 BRP
。但是,由于输入不能大于 999,BRP
足以检测相等性。
对于自修改部分,您可以在数组数据部分设置结束标记,并定义 LDA
和 STA
指令,这些指令将 read/store 处的值数组的 end。只要您的代码有准确的指令,您就知道您已经到达终点。
这是它的工作原理:
LDA store # Initialise dynamic store instruction
STA dyna1
loop INP
dyna1 STA array
SUB toobig
BRP skip
LDA dyna1
ADD one
STA dyna1
SUB staend
BRP print
BRA loop
skip SUB trailer
BRP print # Safer to do BRP than BRZ
BRA loop # Input was less than 999
print LDA dyna1 # Convert dynamic store instruction
SUB store # ... to index
ADD load # ... to load instruction
STA dyna2
loop2 LDA dyna2
SUB one
STA dyna2
SUB load
BRP dyna2
end HLT # all done
dyna2 LDA array
OUT
BRA loop2
store STA array
load LDA array
staend STA after
one DAT 1
toobig DAT 100
trailer DAT 899
array DAT
DAT
DAT
DAT
DAT
DAT
DAT
DAT
DAT
DAT
after DAT
<script src="https://cdn.jsdelivr.net/gh/trincot/lmc@v0.816/lmc.js"></script>
如您所见(运行 此处的脚本),dyna1
和 dyna2
处的指令在它们所在的循环执行期间被修改。