问题描述
我正在寻找一个e-LMC扩展的小矮人计算机程序,该程序将接受不确定的输入并对它们进行冒泡排序。我需要有更多的连续输入,然后进行气泡排序。
INP //read 1st value
STA 0 // for store
INP // read 2nd value
STA 1 // store
INP // read 3rd value
STA 2 // store
LDA 1 // LOOP 1,STEP 1:
SUB 0 //
BRP STEP2 // if R0 and R1 are in order,don't swap them
LDA 1 // Begin swapping registers
STA 3
LDA 0
STA 1 // R1 = R0
LDA 3
STA 0 //R0 = temp
STEP2 LDA 2 // LOOP 1,STEP 2
SUB 1
BRP STEP3 // If R1 and R2 are in order,don't swap them
LDA 2 // Begin swapping registers
STA 3 // temp =R2
LDA 1
STA 2 //R2=R1
LDA 3
STA 1 // R1 = temp
STEP3 LDA 1 // LOOP 2,STEP 1
SUB 0
BRP STEP4 // if R0 andR1 are in order,don't swap them
LDA 1 // Begin swapping registers
STA 3 // temp = R1
LDA 0
STA 1 //R1=R0
LDA 3
STO 0 // R0 = temp
STEP4 LDA 0
OUT
LDA 1
OUT
LDA 2
OUT
HLT
解决方法
由于我不熟悉e-LMC,因此在此提供了一个纯LMC实现。不利的一面当然是LMC限制了空间。由于以下代码占用了62个邮箱(不包括输入数组),因此最多可以输入38个值(未经验证)。
我选择在输入的末尾标记一个0值,即要排序的值不能包含0。
正如您已经在注释中指出的那样,该解决方案在很大程度上依赖于自修改代码。所有标有get***
,set***
和cmp***
的指令都将动态更改为指向数组中的正确元素。
您可以在以下代码段中运行此代码(它会加载模拟器):
#input: 5 2 4 1 3 0
LDA setfirst
STA setcurr1
input INP
setcurr1 STA array
BRZ isempty
LDA setcurr1
ADD one
STA setcurr1
BRA input
isempty LDA array
BRZ zero ; empty array
sort LDA getfirst ; init "curr" indices
STA getcurr1
STA getcurr2
LDA setfirst
STA setcurr2
LDA cmpfirst
STA cmpcurr
STA issorted ; bool: assume sorted
loop LDA getcurr1 ; set "next" indices
ADD one
STA getnext1
STA getnext2
LDA setcurr2
ADD one
STA setnext
getnext1 LDA array
BRZ check ; end of array
cmpcurr SUB array
BRP inc ; no swap needed
getcurr1 LDA array ; swap
STA temp
getnext2 LDA array
setcurr2 STA array
LDA temp
setnext STA array
LDA zero
STA issorted ; was not sorted yet
inc LDA getnext1 ; increment "cur" indices
STA getcurr1
LDA setnext
STA setcurr2
LDA cmpcurr
ADD one
STA cmpcurr
BRA loop
check LDA issorted
BRZ sort
getcurr2 LDA array
BRZ zero ; all done
OUT
LDA getcurr2
ADD one
STA getcurr2
BRA getcurr2
; constants:
zero HLT
one DAT 1
getfirst LDA array
setfirst STA array
cmpfirst SUB array
; variables:
issorted DAT ; boolean
temp DAT ; for swapping
array DAT ; start of array
<script src="https://cdn.jsdelivr.net/gh/trincot/lmc@v0.77/lmc.js"></script>
正如您所写的那样,e-LMC是LMC的扩展,具有更多的寄存器和寻址方法,我想将其更改为可以利用这些扩展的程序并不难。