e-LMC扩展小人电脑泡泡嵌入式程序连续输入
Posted
技术标签:
【中文标题】e-LMC扩展小人电脑泡泡嵌入式程序连续输入【英文标题】:e-LMC extended Little Man Computer bubble embedded program continuous input 【发布时间】:2021-02-08 03:33:29 【问题描述】:我正在寻找一个 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”的语言规范吗? 它有更大的内存地址(0-999),通用寄存器(R4到R7),常量寄存器(R0=0,R1=1,R2=2,R3=999),内存-mapped IO 内存地址 990-999 为 IO 保留。指令集:与 LMC 相同,但具有 MUL 用于乘法、DIV 用于除法、MOV (RN 例如,要从输入中加载一系列数字,您可以执行以下操作。 1) 初始化相关的“STO”指令。将位置 100 设置为相关值,例如“3500”。 2) 输入一个数字并执行 STO 指令(连同其他相关指令)。 3) 将内存位置 100 (3500) 的内容加载到累加器中,加一,并将其存储回其位置 (100)。 STO 指令现在将读取为“3501”。 4) 转到第 2 步并继续,直到提供了设置的数字计数。 这种语言的文档在哪里? 你能收到 PDF 吗? 【参考方案1】:由于我不熟悉 e-LMC,我在这里提供一个纯 LMC 实现。缺点当然是 LMC 的空间有限。由于下面的代码不包括输入数组,占用了62个邮箱,所以最多可以输入38个值(这个未验证)。
我选择使用终止值 0 标记输入的结尾,即要排序的值不能包含 0。
正如您在 cmets 中已经指出的那样,此解决方案严重依赖于自修改代码。所有标有get***
、set***
和cmp***
的指令都会动态更改为指向数组中的正确元素。
您可以在这个 sn-p 中运行此代码(它会加载一个模拟器):
#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 的扩展,具有更多的寄存器和寻址方法,我想将其更改为可以利用这些扩展的程序并不难。
【讨论】:
感谢您的代码。此代码有标签并使用 DAT。 e-LMC 没有。您是否看到 PDF 中的 e-LMC 说明集? 不,我没有,但老实说,它应该是在 Internet 上的可靠站点(而不是文件共享站点)上公开提供的文档。 Stack Overflow 的政策是问题应该包含回答问题所需的所有信息。 你是对的。您的代码实际上对我有很大帮助。我可以通过更改更大内存 1000 的数字代码将其修改为 e-lmc。因此 901 变为 9001 等等。但是,我面临的挑战是更改标签以与直接寻址的寄存器值一致,这样我就不需要变量了。 是否可以将标签替换为实际的内存位置?你能帮忙吗? 不用担心。我让它工作。你是对的,我删除了所有标签,程序仍然像预期的那样运行。我将在 BRZ 上发布一个新问题。谢谢。以上是关于e-LMC扩展小人电脑泡泡嵌入式程序连续输入的主要内容,如果未能解决你的问题,请参考以下文章
将 Python 3.3 嵌入到 C++ 程序中,同时只能从输入中一次读取一行
iOS 8 beta - Today 扩展无法识别嵌入式框架
在具有部署目标 iOS 7.0 及更早版本的扩展包含应用程序中使用嵌入式框架