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 扩展无法识别嵌入式框架

下载资料新手入门级:嵌入式Linux基础教程

在具有部署目标 iOS 7.0 及更早版本的扩展包含应用程序中使用嵌入式框架

从 C++ 应用程序中的嵌入式 Python 调用时,多数组扩展库上的 Numpy 导入失败

我可以将 chrome 扩展应用程序嵌入到我的主要 AngularJS 应用程序中吗?